您的位置:首页 > 其它

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

2015-06-03 00:00 239 查看
摘要: 单项尾部添加法的动态链表建立,并输出。
指针结构体的理解,内部成员也含有一个指针结构体,其用于指向下一个节点(指针结构体的头地址)
指针结构体之间的循环赋值
链表结束判定标志

/*****************
*
通过结构体,建立动态链表,并输出链表。
*
*******************/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#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),退出循环。

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息