指针的问题!!请教高手
我的代码如下,编译没问题,但运行时却出错。我怀疑是指针的错误,请高手指教。^_^
#include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
void createlist(struct node *head)
{
int e;
struct node *p;
head=(struct node *)malloc(sizeof(struct node));
head->next=NULL;
printf("输入非零数据(遇零结束)\n");
scanf("%d",&e);
while(e!=0)
{
p=(struct node *)malloc(sizeof(struct node));
p->data=e;
p->next=head->next;
head->next=p;
scanf("%d",&e);
}
}
void display(struct node *head)
{
while(head->next)
{
printf("%d\t ",head->next->data);
head=head->next;
}
printf("\n");
}
int main()
{
struct node head;
createlist(&head);
display(&head);
return 0;
}
问题点数:20、回复次数:19Top
1 楼fanbest(座天使长)回复于 2004-09-04 20:22:10 得分 0
有了这么一句
struct node head;
createlist(&head);
为什么还要来这么一句?
head=(struct node *)malloc(sizeof(struct node));Top
2 楼UPCC(杂食动物)回复于 2004-09-04 20:22:17 得分 0
这和我昨晚帮别人改的有些相同,你看看吧。都是一类的
不过记得在释放内存(好象我忘记了)
#include<stdio.h>
#include<stdlib.h>
typedef struct mylist
{
int data;
struct mylist *next;
}mylist;
mylist * insert(int d, mylist *head)/*建立链表就是一个插入数据的过程 */
{
mylist *p,*q,*r;
p = (struct mylist *) malloc(sizeof(struct mylist));
p->data = d;
p->next =NULL;
if(head == NULL)
return p;
q = head;
/*
if(q->data < d)
{
p->next = q;
return p;
}//这里必须使用双大括号,不然会返回在return p;
*/
//其实上面这一步没有必要
r= q;
//q = q->next;
while(q && q->data < d)
{
r = q;
q = q->next;
}
if(r==q)//防止头是已经大了
{
p->next = head;
return p;
}
if(q)//有时候已经到队为了,这是q==NULL了
{
r ->next = p;
p ->next = q;
}
else
{
r->next = p;
}
return head;
}
mylist *del(mylist *head)
{
mylist *q, *r;
int d;
printf("del data:");
scanf("%d",&d);
q = head;
r = q->next;
if(q->data == d)
{
free(q) ;
return r;
}
while( r->data != d && r)
{
q = r;
r = r->next;
}
if(r == NULL) return head;
q->next = r->next;
free(r);
return head;
}
mylist *join(mylist *p,mylist *q)
{
mylist *r=NULL;//不然不会被正常排列
while(p)/*因为插入过程会排序,所以可以直接插入数据*/
{
r=insert(p->data,r);
p = p->next;
}
while(q)
{
r=insert(q->data,r);
q = q->next;
}
return r;
}
void print(mylist *h)
{
mylist *temp;
temp=h;
while(temp)////
{
printf("%d\n",temp->data);
temp = temp->next;
}
}
int main()
{
/*
这里没有初始化会在insert里面
if(head == NULL)
return p;
出现问题,至少应该在定义时mylist* head = NULL;但这不是你要的。
*/
mylist *head=(mylist*)malloc(sizeof(mylist));
head->data = 5;//这是先个个数字,不燃是随机值而在insert里对比会有问题(小)
head->next = NULL;//没有初始化,head->next会是一个随机值
/*
if(head->next==NULL){printf("ok");
exit(0); }
*/
head=insert(10,head);
head=insert(8,head);
head=insert(1,head);
print(head);
printf("del start\n");
head = del(head);
print(head);
printf("join start\n");
mylist* tmp = (mylist*)malloc(sizeof(mylist));
tmp->data = 4;
tmp->next = NULL;
head = join(head,tmp);
print(head);
return 0;
}
Top
3 楼kialo(山河水)回复于 2004-09-04 21:50:53 得分 0
请问楼上,你怎么不释放内存呢?free()????????Top
4 楼oldjackyone(老兔子)(她妈妈说:以为你真的很帅么???)回复于 2004-09-04 22:35:26 得分 0
楼主,建议你好好看看 UPCC(杂食动物) ( ) 写的那么一段代码,你的那段代码实在是无能为力....
或者去看看钱能的那本书上的或是老谭的那本书上的链表后,再回头改你的程序。^_^Top
5 楼comebaby(游民)回复于 2004-09-05 01:46:35 得分 0
改成这样就可以了
#include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
void createlist(struct node *&head)
{
int e;
struct node *p;
head=NULL;
printf("输入非零数据(遇零结束)\n");
scanf("%d",&e);
while(e!=0)
{
p=(struct node *)malloc(sizeof(struct node));
p->data=e;
p->next=head;
head=p;
scanf("%d",&e);
}
}
void display(struct node *head)
{
while(head)
{
printf("%d\t ",head->data);
head=head->next;
}
printf("\n");
}
int main()
{
struct node *head;
createlist(head);
display(head);
return 0;
}Top
6 楼prettyladys(我是一个勤奋的男生啊)回复于 2004-09-05 02:45:29 得分 0
好多菜鸟的回答啊。楼上的改得不错。Top
7 楼shmily198(杨琴)回复于 2004-09-05 08:15:11 得分 0
华为火热招聘
咨询电话:13510248216
时间: 历时一个月(平均每人4~5天)
招聘方式:
1. 内部推荐
2. 网上搜索
搜索主要条件:
更新日期: 一天内
意向岗位: 程序员/软件工程师
意向工作地:深圳
原工作地: 不限
酬薪: 2000~9000(包括面议)
年龄: 20~30
工作经验: 主要有C/VC开发经验
注:名字、联系方式已经显示的是已被登入华为人才库,不用再注意。
1. 将搜索的资料登入华为人才库。
http://huawei.com/NASApp/hr/myresume/stepone.jsp
填写资料注意项:
应聘意向:研发类,软件开发
应聘职位:软交换通信工程师
这个是错误的
推荐方式:内部推荐
推荐部门:研发类,中研
2. 将搜索的资料登入中研招聘工作库(szap33-ds)
1) 公司内所有员工均可使用此数据库创建应聘信息,应聘信息文档被首次保存后
将自动关闭,同时刷新创建时间,除“处理信息业务部”、“处理信息研究部”、
“应聘人联系电话”、“简历”外,该文档的创建人将失去对其他内容的修改权限但保留随时查看处理状态的权限。
2)填写真实姓名,中文名用简体字,英文名名在前、姓在后并以一个空格分开。通过重名提示判断创建信息是否重复,同一人信息不得重复录入。
3)现所在省市为应聘者目前居留地,除北京、上海、南京、深圳只填城市名外,其他均填省名和市名,但不含省、市字样,包括重庆和天津,如“四川重庆”。
4)现工作单位、毕业院校均填写全称。
5)员工推荐的信息,渠道选“推荐”;网络下载的信息,渠道选“网络”;应聘者主动投简历或参加招聘会或从“华为电子流”获得的信息,渠道选“自荐”。如渠道选网络,来源就选网站名称,如渠道选自荐,来源就选获得信息的方式或媒体。
6)如创建人为中研员工,提供信息部门及处理信息部门均填写本人所在部门;如创建人非中研员工 ,提供信息部门选“技术支援部、中间实验室、市场部或中研外其他部门,处理信息部门选“中研内其他部门”。
7)标记“*”号的条目为必填项。
填写资料注意项:
提供信息部门:核心网业务部 固定软交换开发部
处理信息部门:核心网业务部 固定软交换开发部
提交信息时请选择“提交研究部接口人”而不是“业务部接口人”
您业可以直接联系负责人:杨琴,工号:39507,13510248216
Top
8 楼ypengfei(Fuck Japan!!!!!!)回复于 2004-09-05 10:16:07 得分 0
…………Top
9 楼jk01dingxian(蓝光书虫~痛并快乐着~)回复于 2004-09-05 10:24:55 得分 0
#include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
void createlist(struct node *head)
{
int e;
struct node *p;
head=NULL;
printf("输入非零数据(遇零结束)\n");
scanf("%d",&e);
while(e!=0)
{
p=(struct node *)malloc(sizeof(struct node));
p->data=e;
p->next=head->next;
head=p;
scanf("%d",&e);
}
}
void display(struct node *head)
{
while(head)
{
printf("%d\t ",head->data);
head=head->next;
}
printf("\n");
}
int main()
{
struct node *head;
createlist(head);
display(head);
return 0;
}
同时有两个建议注意写代码的格式,缩进之类的;还有函数的最下功能化,一个函数只实现一个功能.Top
10 楼kialo(山河水)回复于 2004-09-05 11:02:29 得分 0
楼上的两位给的代码一样是错误的啊!!还是和以前出的问题一样。
FT!~~~~~~~~~~~~Top
11 楼xteaj(半桶水)回复于 2004-09-05 11:25:26 得分 0
comebaby和jk01dingxian的程序都不行,head在返回的时候要被改回去的,
所以不能这样做。Top
12 楼xteaj(半桶水)回复于 2004-09-05 11:27:16 得分 0
kialo的也不会强,你的insert中也不能给head重新赋值,在函数返回时,会
将参数值弹出栈,恢复原值的。Top
13 楼xteaj(半桶水)回复于 2004-09-05 11:29:08 得分 20
include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
void createlist(struct node *head)
{
int e;
struct node *p;
printf("输入非零数据(遇零结束)\n");
scanf("%d",&e);
while(e!=0)
{
p=(struct node *)malloc(sizeof(struct node));
p->data=e;
p->next=head->next;
head->next=p;
scanf("%d",&e);
}
}
void display(struct node *head)
{
while(head->next)
{
printf("%d\t ",head->next->data);
head=head->next;
}
printf("\n");
}
int main()
{
struct node head;
head.next = NULL;
createlist(&head);
display(&head);
return 0;
}
这样应该问题不大。Top
14 楼yji1982(神奇小子)回复于 2004-09-05 11:48:58 得分 0
这个问题可以参考tc目录下include目录中的create.h,del.h,insert.h
不知道是原来有的还是我写的
如果你没有
发邮件给我
我给你
不过我现在上网不容易,也许要等很久Top
15 楼comebaby(游民)回复于 2004-09-05 14:48:17 得分 0
请大家评判一下,我的程序没有错误!!
vc6下测试通过的
to xteaj()
1.void createlist(struct node *&head)中head的已经改了,我用的是指针的引用!!!
2.void display(struct node *head)中头指针是没有必要改动的!!
Top
16 楼kialo(山河水)回复于 2004-09-05 19:16:47 得分 0
TO:xteaj()
你的代码有漏洞吧!因为你申请分配了内存却没释放。!!!Top
17 楼xteaj(半桶水)回复于 2004-09-05 20:53:49 得分 0
To:kialo
这程序并没有要求删除节点,程序结束时会自动释放所有内存的,你放心好了。Top
18 楼xteaj(半桶水)回复于 2004-09-05 20:57:15 得分 0
To:Combaby
对不起,我看错了Top
19 楼lirivernick(不知所云)回复于 2004-09-05 21:11:08 得分 0
根据你的函数定义这里我 觉得要这样改
head=(struct node *)malloc(sizeof(struct node));
改成
(*head)=(struct node *)malloc(sizeof(struct node));
head->next=NULL
改成
(*head)->next=NULL
Top




