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部分是啥意思。
最好每行都注释一下哈!谢谢!
改成下面这样就可以了
#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语言链表问题,有点抽象。的主要内容,如果未能解决你的问题,请参考以下文章