donjames 发表于 2021-9-16 22:34:11

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

//链表的相关操作集
#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;

}

donjames 发表于 2021-9-16 22:36:19

在那个删除结点的函数中,我这个编译器为什么会显示while的循环条件p!=NULL是个永真的条件

Debug007 发表于 2021-9-16 22:56:27

因为删除的数该链表没有的话,在那个删除的函数里面相当于把链表遍历了一边,如果再接着访问链表,那么就会出错,没有访问权限

donjames 发表于 2021-9-17 11:54:40

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

那个怎么解决这个问题

Debug007 发表于 2021-9-17 12:12:16

donjames 发表于 2021-9-17 11:54
那个怎么解决这个问题

把链表的指针重新返回指向链表的head

donjames 发表于 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;

}

页: [1]
查看完整版本: 这个删除结点的函数为什么在删除链表中所没有的数值时会出错?