关于链表出现问题。我是菜鸟,纯粹记下来一步一步学C语言。做点笔记。
.h文件
#include <STDLIB.H>
#include <STDIO.H>
#define OK 0
#define TRUE 1
typedef struct student
{
int num; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
float score; //分数
char add[40]; //地址
};
typedef struct StudentNode
{
struct student* stu_data; //学生的数据信息指针
struct StudentNode* next; //指向下一个结点的指针
}StudentNode, *LinkStudentNode;
//创建具有n个学生信息的链表
int create_student_node_info(LinkStudentNode &stu_node, int n);
分析:在结构体定义中,StudentNode中定义的stu_data为一个指针。这样在每次用的时候都需要给student* stu_data分配空间。所以不要定义为结构体指针。
定义为:
typedef struct StudentNode
{
struct student stu_data; //学生的数据信息
struct StudentNode* next; //指向下一个结点的指针
}StudentNode, *LinkStudentNode;
.cpp文件
//创建具有n个学生信息的链表
int create_student_node_info(LinkStudentNode &stu_node, int n)
{
int i, count = 0;
LinkStudentNode p;
student *s;
//给头指针stu_node分配内存空间
stu_node = (LinkStudentNode)malloc(sizeof(StudentNode));
//问题1
stu_node->next = NULL; //将头结点指向NULL,建立带头结点的链表
for(i = n; i > 0; --i)
{
p = (LinkStudentNode)malloc(sizeof(StudentNode));//生成新结点
p->next=NULL;
p->stu_data=NULL;
s = (student*)malloc(sizeof(student));
count++;
printf("\n输入第%d个学生信息\n", count);
//输入元素信息
printf("学号:");
fflush(stdin);
//问题2
scanf("%d", &s->num);
printf("姓名:");
fflush(stdin);
scanf("%s", s->name);
printf("性别:");//注意此处性别是char型,默认其输入M为男,W为女吧
fflush(stdin);
scanf("%c", &s->sex);
printf("年龄:");
fflush(stdin);
scanf("%d", &s->age);
printf("分数:");
fflush(stdin);
scanf("%f", &s->score);
printf("地址:");
fflush(stdin);
scanf("%s", s->add);
//将p的数据域指向s
p->stu_data = s;
//将当前指针指向NULL
p->next = stu_node->next;
//将当前结点插入到链表中
stu_node->next = p;
//清空分配给p、s的内存
//问题3
//free(p);
//free(s);
}
return OK;
}
问题1:
如在代码问题1处,stu_node->next = NULL;在初始化的时候其数据域也应该指向NULL。
问题2:
如在代码问题2处,我开始想在给num输入数据的时候用scanf("%d", &p->next->num),但是这样操作之后一直不成功。我很是不理解。在csdn上也提了问题。其中提问的网址:http://topic.csdn.net/u/20120413/10/00b01f87-4110-4757-92c5-776f281a718b.html?seed=180822067&r=78239904#r_78239904。而且也有人回答了问题,而且回答的很给力。
我加上老师跟我讲解后我的理解。
首先 p= (LinkStudentNode)malloc(sizeof(StudentNode));//生成新结点。初始化之后,p->stu_data指向NULL。
此时如图,如果想用scanf("%d", &p->next->num),p节点next指针指向的memory都没有分配空间,所指向的空间都是乱指。所以自然没办法这样用。
因此我后来采用如上面代码,又重新定义了一个结点指针s = (student*)malloc(sizeof(student));然后用p->next来指向s。这样就达到了分配空间已经初始化的目的了。
但是这种方法很扯淡。还是看http://topic.csdn.net/u/20120413/10/00b01f87-4110-4757-92c5-776f281a718b.html?seed=180822067&r=78239904#r_78239904的方法的好。
问题3:
在问题3处,我想感觉p开始没释放,于是决定在那释放。但是仔细想想,那里用到的都是指针,其返回的链表stu_node都只是指向这样的位置。所以释放它自然就将其中间数据给释放了。