关于创建动态链表的问题

donotgoback 2005-03-18 04:59:24
本人创建了一个动态链表并输出,模拟PCB(进程控制器),源程序如下:
我的问题是输出的时候多了两个莫名其妙的数,可能是指针问题,但我实在找不到什么地方出了问题
恳请各位高手指点:
#include <conio.h>
#include <stdio.h>
#define NULL 0
#define LEN sizeof(struct PCB)

struct PCB
{char name[9];
int runtime;
int power;
struct PCB *next;
};

int n;
struct PCB *creat(void)
{struct PCB *head;
struct PCB *p1,*p2;
n=0;

printf("input the 1 PCB name,runtime and power:\n");
p1=p2=(struct PCB *)malloc(LEN);

scanf("%s,%d,%d",&p1->name,&p1->runtime,&p1->power);
head=NULL;
while(strcmp(p1->name,"finish")!=0)
{n=n+1;
if(n==1) head=p1;
else{
p2->next=p1;
p2=p1;
p1=(struct PCB *)malloc(LEN);
printf("input the %d PCB name,runtime and power:\n",n);

scanf("%s,%d,%d",&p1->name,&p1->runtime,&p1->power);
}
}
p2->next=NULL;
return(head);
}

main()
{
char ch;
struct PCB *p;
clrscr();
p=creat();
printf("\nNow,These %d records are:\n",n-1);
do{
printf("%s,%d,%d\n",p->name,p->runtime,p->power);
p=p->next;
}while(p!=NULL);
ch=getch();
}
...全文
175 点赞 收藏 7
写回复
7 条回复
xzgyb 2005年03月22日
donotgoback(新仔): 我这用wintc试也好使,因为name为一数组,直接写name
就相当于取得该数组第一个元素的地址
不需要用&

回复 点赞
hesq1523 2005年03月22日
你的scanf("%s,%d,%d",...)有问题,改为:
scanf("%d,%d,%s",...)就ok。至于为什么你可以自己去想了.
回复 点赞
donotgoback 2005年03月21日
我想了一下,是不是因为由于*p1本来就指向PCB结构的首地址,也就是name,所以不用加上地址运算符&?各位高手,我想得对吗?
回复 点赞
donotgoback 2005年03月21日
问题仍然没有解决,在TC2.0中运行不了,在输入finish后停止了,我想可能是
if ( strcmp((*p1)->name,"finish") == 0 )出了问题,但修改后还是不行
还有一个问题,我想问scanf("%s %d %d", (*p1)->name, &(*p1)->runtime,&(*p1)->power);输入名字的格式为什么和运行时间、权值不同?由于名字是字符串格式吗?我百思不得其解,希望老达摩能够不吝执教~~~!!本人感激不尽~~!!
回复 点赞
xzgyb 2005年03月18日
帮你简单改了下
#include <conio.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define LEN sizeof(struct PCB)

struct PCB
{
char name[9];
int runtime;
int power;
struct PCB *next;
};

int n;

struct PCB *creat(void)
{
struct PCB *head;
struct PCB **p1;

n = 0;
head = NULL;
p1 = &head;

while ( 1 )
{
++n;
*p1 = (struct PCB *)malloc(LEN);
printf("input the %d PCB name,runtime and power:\n", n);
scanf("%s %d %d", (*p1)->name,
&(*p1)->runtime,
&(*p1)->power);

if ( strcmp((*p1)->name,"finish") == 0 )
{
free( *p1 );

break;
}

p1 = &(*p1)->next;
}

*p1 = NULL;

return (head);
}

main()
{
char ch;
struct PCB *p;

p=creat();

printf("\nNow,These %d records are:\n",n-1);
do
{
printf("%s,%d,%d\n",p->name,p->runtime,p->power);
p = p->next;
} while(p != NULL);

ch=getch();
}

回复 点赞
Smile_Tiger 2005年03月18日
请根踪调试一下scanf()函数的使用,察看一下各个变量是否赋值正确("%s,%d,%d'有可能得不到正确的输入)

另外注意到 char name[9]; 不要溢出了
回复 点赞
Smile_Tiger 2005年03月18日
题外话:
你的malloc()分配使用后没有释放内存
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告