{
struct node_data *p1,*p2;
if(id==NULL)
{
printf("Please input the deleted id!\n");
return;
}
if(header==NULL)
{
printf("list null!\n");
return;
}
p1=header;
while(id!=p1->id&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(id==p1->id)
{
if(p1==header)
{ printf("the header addr is 0x%x\n",header);
header=p1->next;
printf("new 0x%x\n",header);
}
else
{
p2->next=p1->next;
}
free(p1);
}
}
当删除头结点时 总是有问题 只是把头结点的id 变了 不能完全删除
我在里面加的打印语句 显示两次打印的地址不同 头指针确实指向了下一个结点 但是就是不能完全删除
请指教!
----------------解决方案--------------------------------------------------------
链表内容是这样的 :1 spring 删除头结点后 正确的显示应为:2 summer
2 summer 3 autumn
3 autumn 4 winter
4 winter
但是打印结果显示为:
0 spring
2 summer
3 autumn
4 winter
当再添加一个结点为 “5 luck” 时 显示结果本应为 2 summer
3 autumn
4 winter
5 luck
却只显示为:5 luck
----------------解决方案--------------------------------------------------------
把程序都弄上来看看,只看你上面的应该是没错的。
----------------解决方案--------------------------------------------------------
谢谢版主!问题找到了
你已经不是菜鸟了 下面的留言该换换了
----------------解决方案--------------------------------------------------------
问题虽然找到了 不过我不知道为什么,所以还请帮帮忙
原程序是这样的:
#include<malloc.h>
#include<stdio.h>
#define LEN sizeof(struct node_data)
//#define SIZE 4
struct node_data
{
int id;
char name[32];
struct node_data *next;
};
void delNode(struct node_data *header,int id)
{
struct node_data *p1,*p2;
if(header==NULL)
{
printf("\n list null!\n");
}
p1=header;
while(id!=p1->id&&p1->next!=NULL)
{
printf("id");
p2=p1;
p1=p1->next;
}
if(id==p1->id)
{
if(p1==header)
{
header=p1->next;
}
else
{
p2->next=p1->next;
}
free(p1);
}
}
void printNode(struct node_data *header)
{
struct node_data *p1;
p1=header;
if(header!=NULL)
{
do
{
printf("%d %s\n",p1->id,p1->name);
p1=p1->next;
}
while(p1!=NULL);
}
else
printf("the chain is null\n");
}
void insertNode(struct node_data *header, struct node_data *new_node)
{
struct node_data *p1;
p1=header;
if(new_node==NULL)
{
printf("The new node is null\n");
return;
}
if(header==NULL)
{
printf("xxx\n");
header=new_node;
printf("new addr of head is 0x%x\n", header);
}
else
{
while(p1->next!=NULL)
{
p1=p1->next;
}
p1->next=new_node;
}
new_node->next=NULL;
}
int main()
{
int del_id;
struct node_data *newNode, *p, *head;
FILE *fp;
char buf[128];
if((fp=fopen("sample.txt","r"))==NULL)
{
printf("cannot open file\n");
return -1;
}
head = NULL;
fgets(buf, 128, fp);
while(!feof(fp))
{
/* add your codes to insert node */
newNode = (struct node_data*)malloc(LEN);
sscanf(buf, "%d %s",&(newNode->id),newNode->name);
printf("addr of head is 0x%x\n", head);
if(head == NULL)
head = newNode;
else
insertNode(head, newNode);
printf("new addr of head is 0x%x\n", head);
fgets(buf, 128, fp);
}
printf("2id\n");
fclose(fp);
printNode(head);
printf("Input the deleted num is:");
scanf("%d", &del_id);
delNode(head, del_id);
printNode(head);
printf("Input the insertnode id and name:");
newNode = (struct node_data*)malloc(LEN);
scanf("%d%s",&(newNode->id),newNode->name);
insertNode(head, newNode);
printNode(head);
/* release all memory */
while(head != NULL)
{
p = head;
head = head->next;
free(p);
}
return 0;
}
----------------解决方案--------------------------------------------------------
引用
问题虽然找到了
问题在哪里?你找到了,我还没呢?
----------------解决方案--------------------------------------------------------
我只是解决了 输出对了 我自己也不知道为什么
我把void delNode(struct node_data *header,int id)里面 如果p1是头指针的判断放到了主函数里面,就对了
因为我指针学的不好,所以我自己以为是我的指针使用上有问题。真正原因我不清楚
----------------解决方案--------------------------------------------------------
下面是改动好的程序,没有改动的就不帖了,也有可能不是我自己以为的改动把程序改好了,所以请大家指正。
struct node_data *delNode(struct node_data *header,int id)
{
struct node_data *p1,*p2;
p1=header;
while(id!=p1->id&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
p2->next=p1->next;
free(p1);
return header;
}
int main()
{
int del_id;
struct node_data *newNode, *p, *head;
FILE *fp;
char buf[128];
if((fp=fopen("sample.txt","r"))==NULL)
{
printf("cannot open file\n");
return -1;
}
head = NULL;
fgets(buf, 128, fp);
while(!feof(fp))
{
/* add your codes to insert node */
newNode = (struct node_data*)malloc(LEN);
sscanf(buf, "%d %s",&(newNode->id),newNode->name);
printf("addr of node is 0x%x\n", newNode);
if(head == NULL)
{
head = newNode;
}
else
{
insertNode(head, newNode);
}
printf("new addr of node is 0x%x\n", newNode);
fgets(buf, 128, fp);
}
fclose(fp);
printNode(head);
printf("Input the deleted num is:");
p=head;
scanf("%d", &del_id);
if(p->id==del_id)
{
head=p->next;
}
else
{
head=delNode(head,del_id);
}
printNode(head);
printf("Input the insertnode id and name:");
newNode = (struct node_data*)malloc(LEN);
scanf("%d%s",&(newNode->id),newNode->name);
insertNode(head, newNode);
printNode(head);
/* release all memory */
while(head != NULL)
{
p = head;
head = head->next;
free(p);
}
return 0;
}
----------------解决方案--------------------------------------------------------
用dev-c++运行程序的时候一直出问题,访问到不可访问的内存单元了,暂时找不到哪里出错了。
我回去再看看。
楼主用的是什么编译器,能正常运行?
----------------解决方案--------------------------------------------------------
我是在linux下面运行的。谢谢版主!
----------------解决方案--------------------------------------------------------