C 链表问题

关于链表出现问题。我是菜鸟,纯粹记下来一步一步学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;

//清空分配给ps的内存

//问题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都只是指向这样的位置。所以释放它自然就将其中间数据给释放了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值