| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 586 人关注过本帖
标题:[求助]链表的插入问题!~~~~~~~~~~~~~急~~~~~~~~~~
只看楼主 加入收藏
sjt
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-8-1
收藏
 问题点数:0 回复次数:3 
[求助]链表的插入问题!~~~~~~~~~~~~~急~~~~~~~~~~

以下是我在TC2.0下编的程序,问题出在不能插入结构体(插入的结构体位于链表的开头)。每次插入一个结构体,输出的链表数据除了插入的那个结构体(位于链表开头)数据准确无误以外,之后的数据就都变了.........
本人还是一个菜鸟,只学了C语言3个月,还望诸位大侠能多多指教!
#include<stdio.h>
#include<string.h>
#include<alloc.h>
#include<stdlib.h>
#include<ctype.h>
#define PR printf
#define SC scanf
#define NULL 0

struct jijin
{int money;
float sum;
struct jijin *next;
};
struct jijin *head_j;

struct data
{long time;
int n;
struct jijin *ps;
struct data *next;
};
struct data *head_d;
int n_d=0;

menu_data()
{
char s[80];
int c;
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
printf("*************************************MENU**************************************\n\n");
printf(" 1.Read\n");
printf(" 2.Creat .\n");
printf(" 3.Insert.\n");
printf(" 4.save.\n");
printf(" 5.Quit.\n");
printf("********************************************************************************\n");
do{
printf("\n Enter you choice(1~4):"); /*提示输入选项*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整型数*/
}while(c<1||c>5); /*选择项不在1~4之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}

void print_d(struct data *head_d)
{struct data *p;
struct jijin *j;
p=head_d;
j=p->ps;
if(head_d!=NULL)
printf("**************************************DATA**************************************\n");
printf("================================================================================\n");
printf("NAME DATE MONEY NET VALUE LOT \n");
do
{printf("%ld\n",p->time);
do
{
printf("%d\n",j->money);
printf("%f\n",j->sum);
j=j->next;
}while(j!=NULL);
p=p->next;
}while(p!=NULL);
printf("================================================================================\n");
printf("********************************************************************************\n");
}

void save_d(struct data *head_d)
{struct data *p;struct jijin *j;
FILE *fp;
printf("Saving.............\n");
getch();
fp=fopen("d:\\data","w"); /*为输出打开一个二进制文件,为只写方式*/
p=head_d; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{j=p->ps;
fwrite(p,sizeof(struct data),1,fp);
while(j!=NULL)
{
fwrite(j,sizeof(struct jijin),1,fp);
j=j->next;
}
p=p->next;
}
fclose(fp); /*关闭文件*/
printf("Success!\n");
}

struct data *input_d()
{int a;
struct data *p;
struct jijin *p1,*p2;
p=(struct data*)malloc(sizeof(struct data));
p->ps=p1=p2=(struct jijin*)malloc(sizeof(struct jijin)); /*head为setting初始地址*/
printf("Please input the totol number \n");
scanf("%d",&(*p).n);
printf("please tell me wen you bought this jijin\n");
scanf("%ld",&(*p).time);
for(a=1;a<=p->n;a++)
{printf("money\n");
scanf("%d",&(*p1).money);
printf("sum\n");
scanf("%f",&(*p1).sum);
if(a==1)head_j=p1;
else p2->next=p1;
p2=p1;
p1=(struct jijin*)malloc(sizeof(struct jijin));
}
p2->next=NULL;
return(p);
}


struct data *creat_d()/*建立一个新的结构体*/
{
head_d=input_d();
head_d->next=NULL;
print_d(head_d);
getch();
return(head_d);
}

struct data *insert_d(struct data *head_d)
{
struct data *p,*p0;
p=head_d;
p0=input_d();
head_d=p0;
p0->next=p;
return(head_d);
}


main()
{

for(;;)
{
switch(menu_data())
{
case 1:print_d(head_d);break;
case 2:head_d=creat_d();save_d(head_d);break;
case 3:head_d=insert_d(head_d);print_d(head_d);getch();save_d(head_d);break;
case 4:save_d(head_d);break;
case 5:exit(0);
}
}

}

搜索更多相关主题的帖子: 链表 
2007-08-09 23:33
sjt
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-8-1
收藏
得分:0 

附:我已经查了三天了,实在是查不出来,还望烦劳诸位大侠能够为晚辈指点迷津!谢谢了!~~~~~!

2007-08-09 23:51
viky2003
Rank: 5Rank: 5
等 级:职业侠客
帖 子:375
专家分:383
注 册:2007-4-11
收藏
得分:0 
以下是引用sjt在2007-8-9 23:33:03的发言:

以下是我在TC2.0下编的程序,问题出在不能插入结构体(插入的结构体位于链表的开头)。每次插入一个结构体,输出的链表数据除了插入的那个结构体(位于链表开头)数据准确无误以外,之后的数据就都变了.........
本人还是一个菜鸟,只学了C语言3个月,还望诸位大侠能多多指教!-----------建议用vc或dev c++!
#include<stdio.h>
#include<string.h>
#include<alloc.h>
#include<stdlib.h>
#include<ctype.h>
#define PR printf
#define SC scanf
#define NULL 0-------------不需要你定义宏,库里面早就定义好了!!

struct jijin
{int money;
float sum;
struct jijin *next;
};
struct jijin *head_j;

struct data
{long time;
int n;
struct jijin *ps;
struct data *next;
};
struct data *head_d;
int n_d=0;

menu_data()---------------最好显示的定义int
{
char s[80];--------------------s[6]足够了,不然你的atoi的话int型可能溢出!!
int c;
printf("press any key enter menu......\n");/*提示压任意键继续*/
getch(); /*读入任意字符*/
clrscr(); /*清屏*/
printf("*************************************MENU**************************************\n\n");
printf(" 1.Read\n");
printf(" 2.Creat .\n");
printf(" 3.Insert.\n");
printf(" 4.save.\n");
printf(" 5.Quit.\n");
printf("********************************************************************************\n");
do{
printf("\n Enter you choice(1~4):"); /*提示输入选项*/----------chioce(1~5)PR:
scanf("%s",s); /*输入选择项*/----------------------------------SC
c=atoi(s); /*将输入的字符串转化为整型数*/
}while(c<1||c>5); /*选择项不在1~4之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}

void print_d(struct data *head_d)
{struct data *p;
struct jijin *j;
p=head_d;
j=p->ps;
if(head_d!=NULL)
printf("**************************************DATA**************************************\n");
printf("================================================================================\n");
printf("NAME DATE MONEY NET VALUE LOT \n");---------------感觉上面的3个printf可以用PR代替,并{}起来吧!!
do----------------------------------------如果这个链表为空的话,那下面的就错了!!
{printf("%ld\n",p->time);
do
{
printf("%d\n",j->money);
printf("%f\n",j->sum);
j=j->next;
}while(j!=NULL);
p=p->next;
}while(p!=NULL);
printf("================================================================================\n");
printf("********************************************************************************\n");
}




void save_d(struct data *head_d)
{struct data *p;struct jijin *j;
FILE *fp;
printf("Saving.............\n");-------------PR
getch();
fp=fopen("d:\\data","w"); /*为输出打开一个二进制文件,为只写方式*/
p=head_d; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{j=p->ps;
fwrite(p,sizeof(struct data),1,fp);
while(j!=NULL)
{
fwrite(j,sizeof(struct jijin),1,fp);
j=j->next;
}
p=p->next;
}
fclose(fp); /*关闭文件*/
printf("Success!\n");------------PR
}

struct data *input_d()
{int a;
struct data *p;
struct jijin *p1,*p2;
p=(struct data*)malloc(sizeof(struct data));
p->ps=p1=p2=(struct jijin*)malloc(sizeof(struct jijin)); /*head为setting初始地址*/
printf("Please input the totol number \n");
scanf("%d",&(*p).n);---------------------------------写成&(p->n)不更好
printf("please tell me wen you bought this jijin\n");
scanf("%ld",&(*p).time);
for(a=1;a<=p->n;a++)
{printf("money\n");
scanf("%d",&(*p1).money);
printf("sum\n");
scanf("%f",&(*p1).sum);
if(a==1)head_j=p1;
else p2->next=p1;
p2=p1;
p1=(struct jijin*)malloc(sizeof(struct jijin));
}
p2->next=NULL;
return(p);
}


struct data *creat_d()/*建立一个新的结构体*/
{
head_d=input_d();
head_d->next=NULL;
print_d(head_d);
getch();
return(head_d);
}

struct data *insert_d(struct data *head_d)
{
struct data *p,*p0;
p=head_d;
p0=input_d();
head_d=p0;---------------错误就在此处,应该是先p0->next=p;
p0->next=p;---------------然后是phead=p0;不然你最先phead 指向的链表地址就丢失了!!其他的我就不看了!

return(head_d);
}


main()
{

for(;;)
{
switch(menu_data())
{
case 1:print_d(head_d);break;
case 2:head_d=creat_d();save_d(head_d);break;
case 3:head_d=insert_d(head_d);print_d(head_d);getch();save_d(head_d);break;
case 4:save_d(head_d);break;
case 5:exit(0);
}
}

}



要练习算法就来http:///!!有挑战哦!!
2007-08-10 09:12
sjt
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-8-1
收藏
得分:0 
回复:(viky2003)以下是引用sjt在2007-8-9 23:33:03...
你好,首先谢谢你的指点。可是我调试以后,问题(当插入一个结构体以后,只有处于链表开头的结构体数据能够正常输出,之后的数据输出的是乱码)依旧存在。老烦诸位大侠能够为在下指出具体错误!(我估计是哪里地址搞错了,但是就是查不出来。算上今天我已经查了四天了....)
2007-08-10 16:41
快速回复:[求助]链表的插入问题!~~~~~~~~~~~~~急~~~~~~~~ ...
数据加载中...
 
   



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

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