c语言链表问题,有点抽象。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言链表问题,有点抽象。相关的知识,希望对你有一定的参考价值。

照着书本打了段代码,不知道哪里出错就是运行不了,代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
struct student

char name[10];
int num;
struct student *next;
*head,*p1,*p2,*p;
int n=0;
void main ()

creat();
shuchu();


void creat()

p1=(struct student *)malloc(sizeof(struct student));
p2=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);
while(p1->name!=0)

n+=1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(sizeof(struct student));
printf("输入姓名\n");
scanf("%s",p1->name);
printf("输入学号\n");
scanf("%d",&p1->num);




void shuchu()

p=head;
while(p!=NULL)

printf("%s,%d",p->name,p->num);
p=p->next;




我用的是vs2012,错误提示如下:

1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(13): warning C4013: “creat”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(14): warning C4013: “shuchu”未定义;假设外部返回 int
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(18): error C2371: “creat”: 重定义;不同的基类型
1>d:\documents\visual studio 2012\projects\consoleapplication2\consoleapplication2\源.c(41): error C2371: “shuchu”: 重定义;不同的基类型
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

还有许多链表的问题,我上面那个代码的那个if的else部分是啥意思。
最好每行都注释一下哈!谢谢!

参考技术A

改成下面这样就可以了

#include <stdio.h>

#include<stdlib.h>

#include<string.h> 

struct student 

 char name[10];

 int num;

 struct student *next;

*head,*p1,*p2,*p;

int n=0;

void creat()

 p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址

 printf("输入姓名\\n");

 scanf("%s",p1->name);

 printf("输入学号\\n");

 scanf("%d",&p1->num); 

 while(p1->num!=0) 

  

  n+=1;

  if(n==1)//第一条记录为头记录

   head=p1;//设置第一条记录为头记录 

  else

   p2->next=p1;//如果不是第一条记录,把next指向上一次循环新建的内存地址

  p2=p1;  

  p1=(struct student *)malloc(sizeof(struct student)); 

  printf("输入姓名\\n"); 

  scanf("%s",p1->name);

  printf("输入学号\\n"); 

  scanf("%d",&p1->num);

  

 p2->next=NULL;//要加上这一句,表示最后一条记录

void shuchu() 

 p=head;

 while(p!=NULL)

  

  printf("%s , %d\\n",p->name,p->num);//加上\\n分行

     p=p->next;

  

void main () 

 

 creat();

 shuchu(); 

 system("pause");//该语句可防止运行结束时退出命令窗口,但多了提示“请按任意键继续...”这样才能看到屏幕内容

 

还有我把这程序完善了,可以到这里下载

追问

p2=p1=(struct student *)malloc(sizeof(struct student)); //这里应该让p1,p2指向同一个地址
第一个问题:为啥这里要指向同一个地址呢?
第二个问题:代码中出现动态内存分配的函数malloc,为什么不需要用free()函数来释放内存呢?

追答

第一个问题:其实从程序上看,p2相当于是指向链表最后一条记录的指针,p1相当于是临时记录,刚开始当然要指向同一个记录了!
第二个问题:因为你显示结束后,程序也就结束了,编译器会自动收回内存

本回答被提问者和网友采纳

以上是关于c语言链表问题,有点抽象。的主要内容,如果未能解决你的问题,请参考以下文章

C语言操作链表详解

C语言操作链表详解

C语言操作链表详解

java如何实现链表

C语言中数据结构中的单向链表的问题;

C语言写的链表。明明没有错误,为啥编译器还会报错,?而且还爆出100+的错误,求解。