java 链表放置结构体_通过结构体,建立动态链表,并输出链表

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:21   3048   0

/*****************

*

通过结构体,建立动态链表,并输出链表。

*

*******************/

#include

#include

#include

#define LEN sizeof(struct student) //宏定义 将LEN 替换为student 结构体的大小数值

struct student *create(); //声明创建新链表(节点)(结构体)函数,返回该链表的头地址(指针),(尾部添加节点方法)

void print(struct student *head); // 打印链表函数(此处为函数声明,

//print函数()内的形参可有可无,有则主要给编程人员看的)

struct student //定义结构体类型,即每个创建的节点(结构体)内包含什么类型的数据

{

long num;

float score;

struct student *next; //用来连接下一个结构体的指针

};

int n; //全局变量,用来记录创建了多少个结构体

void main()

{

struct student *stu; //定义一个指针类型的结构体stu

stu = create(); //调用创建新节点(结构体)函数create()并将其创建成的链表头地址(指针)赋给stu指针

print(stu); //用create()返回的指针作实参调用函数print()

printf("\n\n");

system("pause"); //此处system函数()内带双引号,中文的任意键退出提示

}

struct student *create() //定义创捷指针结构体的函数

{

struct student *head; // 定义指针结构体变量*head, *p1,*p2,用于存放新创建的指针结构体

struct student *p1,*p2;

p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构体的大小

//用动态内存分配函数malloc()分配内存给指针结构体p1和p2

printf("please enter the num : "); //指针结构体p1先获得数据

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

printf("please enter the score : ");

scanf("%f",&p2->score);

head = NULL; //定义头指针为空值

n = 0; //初始话计数器

while(p1->num) //判断指针结构体p1成员所获得的数据是否为0,否时(即表示p1获取数据成功)则继续一下执行

{

n++; // 节点创建记数器+1

if(1==n) //当创建的为第一节点时,

{

head = p1; //将指针结构体p1的首地址赋给指针接头体head(即让头指针结构体指向p1)

}

else //若是第一个之后创建的指针接头体

{

p2->next = p1; //将p2指针结构体尾地址指向指针结构体p1首地址

}

p2 = p1; //让p2指向p1,为后续p1的从新获取数据步骤作备份

p1 = (struct student *)malloc(LEN); //再次使用动态内存分配函数给p1指针结构体分配特定的内存空间(此时即为再次创建新节点(指针结构体))

printf("\nPlease enter the num :"); //新指针结构体p1获得数据

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

printf("\nPlease enter the score :");

scanf("%f",&p1->score);

}

p2->next = NULL; //当循环不执行(即p1->num,获得0值时) 将p2指针结构体成员 p2->next指向NULL即0,表示链表的结束

return head; //函数struct student *create() 返回链表的头地址。

}

void print(struct student *head) //定义print函数,接收链表头地址(实参),执行运行,此处的形参(类型和名称)必须要有

{

struct student *p; // 定义一个新的指针结构体变量p

printf("\nThere are %d records!\n\n", n);

p = head; //所定义的新的p是用于接收函数struct student *create()返回回来的链表头地址,此地址在print函数内用head这个指针来传递

if( p ) //判断链表的头地址是否为空,(即有没有创建一个新的节点(指针结构体))

{

do

{

printf("学号为 %d 的成绩是: %f\n", p->num, p->score);//注意指针结构体的成员引用格式:指针结构体名->成员名;

//将头地址(指针接头体struct student *head) 的成员打印出来

p = p->next; //将头地址(指针接头体struct student *head) 指向下一节点头地址。

//尾成员存放的地址(p->next内的地址即为下一个节点(指针结构体)的头地址)

}while( p ); //直到p值为NULL,(即0),退出循环。

}

}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP