我写的一个链表,采用的是尾插法,其中进行删除操作。
为什么不能删除第一个节点的数据?其他的节点就可以。
代码如下:
#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
int data;
struct node *next;
}Node;
Node *head=NULL;
void winsert(int x) //插入节点,尾插法
{
Node *temp=(Node *)malloc(sizeof(Node));
Node *list=head;
temp->data=x;
temp->next=NULL;
if(head==NULL)
{
head=temp;
}
else
{ while(list->next!=NULL)
{
list=list->next;
}
list->next=temp;
}
}
void Print() //输出链表
{
Node *temp=head;
while(temp)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
int dele(int x) //删除节点
{
Node *front=head;
Node *temp=head;
while(temp)
{ if(temp->data==x)
{ front->next=temp->next;
free(temp);
return true;
}
front=temp;
temp=temp->next;
}
return false;
}
int main()
{ int x;
printf("请输入要插入的数,直到负数结束:");
while(1)
{
scanf("%d",&x);
if(x<0)
break;
winsert(x);
}
printf("数据输入完成 ");
Print();
printf("请输入要删除的数:");
scanf("%d",&x);
if(dele(x))
{ printf("数据已删除:");
Print();}
else
printf("删除失败\n");
}
修改处见注释,供参考:
#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
int data;
struct node *next;
}Node;
Node *head=NULL;
void winsert(int x) //插入节点,尾插法
{
Node *temp=(Node *)malloc(sizeof(Node));
Node *list=head;
temp->data=x;
temp->next=NULL;
if(head==NULL)
{
head=temp;
}
else
{
while(list->next!=NULL)
{
list=list->next;
}
list->next=temp;
}
}
void Print() //输出链表
{
Node *temp=head;
while(temp)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
int dele(int x) //删除节点
{
Node *front=head;
Node *temp=head;
while(temp && temp->data != x) //修改
{
//if(temp->data==x)
//{
// front->next=temp->next;
// free(temp);
// return true;
//}
front=temp;
temp=temp->next;
}
if (!temp) return false; //修改
if (temp == head) //修改
head = temp->next;
else //修改
front->next=temp->next;
free(temp);
return true;
}
int main()
{ int x;
printf("请输入要插入的数,直到负数结束:");
while(1)
{
scanf("%d",&x);
if(x<0)
break;
winsert(x);
}
printf("数据输入完成 ");
Print();
printf("请输入要删除的数:");
scanf("%d",&x);
if(dele(x))
{
printf("数据已删除:");
Print();
}
else
printf("删除失败\n");
return 0;
}
请问:头节点前面有没有节点?如果要删除的刚好是头节点,就把下一节点设置为头节点。
#include "stdio.h"
#include "stdlib.h"
#define true 1
#define false 0
typedef struct node{
int data;
struct node *next;
}Node;
Node *head=NULL;
void winsert(int x) //插入节点,尾插法
{
Node *temp=(Node *)malloc(sizeof(Node));
Node *list=head;
temp->data=x;
temp->next=NULL;
if(head==NULL)
{
head=temp;
}
else
{ while(list->next!=NULL)
{
list=list->next;
}
list->next=temp;
}
}
void Print() //输出链表
{
Node *temp=head;
while(temp)
{
printf("%d ",temp->data);
temp=temp->next;
}
printf("\n");
}
int dele(int x) //删除节点
{
Node *front=head;
Node *temp=head;
while(temp)
{
if(temp->data==x)
{
// 判断是否是头节点
if(temp == head){
head = temp->next;
}else {
front->next = temp->next;
}
free(temp);
return true;
}
front=temp;
temp=temp->next;
}
return false;
}
int main()
{ int x;
printf("请输入要插入的数,直到负数结束:");
while(1)
{
scanf("%d",&x);
if(x<0)
break;
winsert(x);
}
printf("数据输入完成 ");
Print();
printf("请输入要删除的数:");
scanf("%d",&x);
if(dele(x))
{ printf("数据已删除:");
Print();}
else
printf("删除失败\n");
}
因为第一个节点中的next指向下一个节点,你释放了他的空间,自然就没有指针指向next指向的节点了
可以看看我的链表文章
问题很简单,假如你第一个head 就满足你的条件呢?你那样写不对的
把del 里面的if 判断稍微调整下:
if(temp->data==x) //找到节点
{
if (temp == head) { //首先确定是不是head
head = temp->next;
} else { // 中间没有问题
front->next=temp->next;
}
free(temp);
return true;
}