鱼C论坛

 找回密码
 立即注册
查看: 680|回复: 5

[已解决]这个删除结点的函数为什么在删除链表中所没有的数值时会出错?

[复制链接]
发表于 2021-9-16 22:34:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//链表的相关操作集
#include<stdio.h>
#include<stdlib.h>
typedef struct Node *node;
struct Node{
    int data;
    node next;
};
node CreateList()//构建链表
{
    node head=NULL,tail,p;
    int num;
    scanf("%d",&num);
    if(num==-1)
    {
        return head;
    }
    else
    {
        p=(node)malloc(sizeof(struct Node));
        head = p;
    }
    while(num!=-1)
    {
        tail=p;//步骤一:将尾结点指向新节点
        tail->data = num;//步骤二:给新申请的结点传入数据
        p=(node)malloc(sizeof(struct Node));//步骤三:申请新的结点
        tail->next=p;//步骤四:链接
        scanf("%d",&num);//步骤五:继续读入带传入的数据,通过此数据来判断是否要继续申请下一个结点
    }
    tail->next=NULL;//步骤六:比较容易遗忘的一点,就是让尾结点指向NULL
    return head;
}
void Print(node head)//打印链表中的数据
{
    node p=head;
    while(p!=NULL)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    putchar('\n');
}
void Delete_K(node *phead,int k)//删除带有数值K的结点
{
    node p=*phead,temp=NULL;
    while (p->data!=k&&p!=NULL)//为何这里的就是永真
    {
        temp=p;
        p = p->next;
    }
    if(p->data==k)
    {
        if(p==*phead)
        {
            *phead=p->next;
            free(p);
        }
        else
        {
            temp->next=p->next;
            free(p);
        }
    }
    else
    {
        printf("没有此节点!");
    }
}
void Insert_n_th(node head,int n)//插入到第n个结点之后
{
    node p=head,temp=NULL;
    int cnt=1;
    while(cnt!=n&&p!=NULL)//为何这里的不是永真
    {
        p=p->next;
        cnt++;
    }
    if(p==NULL)
        printf("not found!");
    else
    {
        temp=(node)malloc(sizeof(struct Node));//申请新节点的内存
        scanf("%d",&temp->data);//为新节点传入数据
        temp->next=p->next;
        p->next=temp;
    }
}
int main(int argc,char *argv[])
{
    node head=NULL;
    head=CreateList();
    Print(head);
    int n;
    printf("请输入插入到第几个节点后面:\n");
    scanf("%d",&n);
    Insert_n_th(head,n);
    Print(head);
    int k;
    printf("请输入要删除结点的值:\n");
    scanf("%d",&k);
    Delete_K(&head,k);
    Print(head);
    return 0;

}
最佳答案
2021-9-17 12:12:16
donjames 发表于 2021-9-17 11:54
那个怎么解决这个问题

把链表的指针重新返回指向链表的head
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 22:36:19 | 显示全部楼层
在那个删除结点的函数中,我这个编译器为什么会显示while的循环条件p!=NULL是个永真的条件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 22:56:27 | 显示全部楼层
因为删除的数该链表没有的话,在那个删除的函数里面相当于把链表遍历了一边,如果再接着访问链表,那么就会出错,没有访问权限
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 11:54:40 | 显示全部楼层
Debug007 发表于 2021-9-16 22:56
因为删除的数该链表没有的话,在那个删除的函数里面相当于把链表遍历了一边,如果再接着访问链表,那么就会 ...

那个怎么解决这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-17 12:12:16 | 显示全部楼层    本楼为最佳答案   
donjames 发表于 2021-9-17 11:54
那个怎么解决这个问题

把链表的指针重新返回指向链表的head
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 16:58:32 | 显示全部楼层
多谢大佬,解决了!
//链表的相关操作集
#include<stdio.h>
#include<stdlib.h>
typedef struct Node *node;
struct Node{
    int data;
    node next;
};
node CreateList()//构建链表
{
    node head=NULL,tail,p;
    int num;
    scanf("%d",&num);
    if(num==-1)
    {
        return head;
    }
    else
    {
        p=(node)malloc(sizeof(struct Node));
        head = p;
    }
    while(num!=-1)
    {
        tail=p;//步骤一:将尾结点指向新节点
        tail->data = num;//步骤二:给新申请的结点传入数据
        p=(node)malloc(sizeof(struct Node));//步骤三:申请新的结点
        tail->next=p;//步骤四:链接
        scanf("%d",&num);//步骤五:继续读入带传入的数据,通过此数据来判断是否要继续申请下一个结点
    }
    tail->next=NULL;//步骤六:比较容易遗忘的一点,就是让尾结点指向NULL
    return head;
}
void Print(node head)//打印链表中的数据
{
    node p=head;
    while(p!=NULL)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    putchar('\n');
}
node Delete_K(node head,int k)//删除带有数值K的结点,由于要改变传入指针(指向结构体的指针)的值(此情况是特殊情况,当删除的结点是头结点),因此要传入指针的指针来改变指针的值
{
    node p=head,temp=NULL;
    if(p==NULL)
    {
        printf("链表为空\n");
        return NULL;
    }
    while(p!=NULL)
    {
        if(p->data==k)//找到要删除的节点的位置
        {
            if(p==head)//为第一个结点
            {
                head=p->next;
                free(p);
                break;
            }
            else
            {
                temp->next=p->next;
                free(p);
                break;
            }
        }
        temp=p;
        p=p->next;
    }
    if(p!=NULL)
    {
        return head;
    }
    else
    {
        printf("未找到!\n");
        return head;
    }
}
void Insert_n_th(node head,int n)//插入到第n个结点之后
{
    node p=head,temp=NULL;
    int cnt=1;
    while(cnt!=n&&p!=NULL)//为何这里的不是永真
    {
        p=p->next;
        cnt++;
    }
    if(p==NULL)
        printf("not found!");
    else
    {
        temp=(node)malloc(sizeof(struct Node));//申请新节点的内存
        printf("请输入要插入的结点的值:\n");
        scanf("%d",&temp->data);//为新节点传入数据
        temp->next=p->next;
        p->next=temp;
    }
}
int main(int argc,char *argv[])
{
    node head=NULL;
    head=CreateList();
    Print(head);
    int n;
    printf("请输入插入到第几个节点后面:\n");
    scanf("%d",&n);
    Insert_n_th(head,n);
    Print(head);
    int k;
    printf("请输入要删除结点的值:\n");
    scanf("%d",&k);
    head=Delete_K(head,k);
    Print(head);
    return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 08:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表