| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 726 人关注过本帖
标题:链表的问题 请多指教
只看楼主 加入收藏
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
 问题点数:0 回复次数:14 
链表的问题 请多指教
void delNode(struct node_data *header,int id)
{
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 变了 不能完全删除
我在里面加的打印语句 显示两次打印的地址不同 头指针确实指向了下一个结点 但是就是不能完全删除
请指教!
搜索更多相关主题的帖子: 链表 指教 
2006-08-01 13:29
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 
链表内容是这样的 :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
2006-08-01 13:35
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
把程序都弄上来看看,只看你上面的应该是没错的。

对不礼貌的女生收钱......
2006-08-01 15:59
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 

谢谢版主!问题找到了

你已经不是菜鸟了 下面的留言该换换了

2006-08-01 16:08
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 

问题虽然找到了 不过我不知道为什么,所以还请帮帮忙
原程序是这样的:
#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;
}

2006-08-01 16:29
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
引用
问题虽然找到了

问题在哪里?你找到了,我还没呢

对不礼貌的女生收钱......
2006-08-01 16:32
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 
我只是解决了 输出对了 我自己也不知道为什么

我把void delNode(struct node_data *header,int id)里面 如果p1是头指针的判断放到了主函数里面,就对了

因为我指针学的不好,所以我自己以为是我的指针使用上有问题。真正原因我不清楚
2006-08-01 16:39
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 

下面是改动好的程序,没有改动的就不帖了,也有可能不是我自己以为的改动把程序改好了,所以请大家指正。
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;
}

2006-08-01 16:42
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
用dev-c++运行程序的时候一直出问题,访问到不可访问的内存单元了,暂时找不到哪里出错了。
我回去再看看。
楼主用的是什么编译器,能正常运行?

对不礼貌的女生收钱......
2006-08-01 17:25
saya
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2006-7-19
收藏
得分:0 
我是在linux下面运行的。谢谢版主!
2006-08-01 17:31
快速回复:链表的问题 请多指教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021577 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved