您的位置:首页 > 其它

链表基础与解析//建立一个拥有3个学生数据的动态链表

2014-01-15 10:51 453 查看
作者:张煜

************************************************************************************************

//建立一个拥有3个学生数据的单向动态链表

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

算法考虑:
要用到动态内存分配的知识和有关函数(malloc,calloc,realloc,free函数)
定义三个指针变量:head,p1和p2,都是指向struct Student类型数据的。
先用malloc函数开辟第一个结点,使p1和p2都指向第一个结点。
从外部设备录入第一个学生信息给第一个节点,在此约定学号不会为0,如果我们输入的学生信息为0的话,
就证明链表的过程完成,该结点的不应该添加链接到链表之中。

************************************************************************************************

先使head的值为NULL,这是链表为“空”时的情况(即head不指向任何结点,在表中无结点),当建立第一个结点就使head指向该结点。
如果输入的p->num不等于0,则输入的是第一个节点的数据(n=1),令head=p1,即把p1的值赋值给head,也就是使head也指向新开辟的结点。开辟下一个结点使p1指向它,并输入数据。

*************************************************************************************************

如果输入的p1->num!=0,则应该链入第二个结点(n=2),由于n!=1;则将p1的值赋值给p2->next,
此时p2指向第一个结点,因此执行“p2->next=p1”就将新的结点的地址赋值给第一个结点的next成员,
使第一个结构体的next成员指向第二个结点。接着p2=p1,也就是使p2指向刚才建立的结点。

*************************************************************************************************

接着再开辟一个结点并使p1指向他,并输入该结点的数据。在第三次循环中,由于n=3(n!=1),又将p1的值赋值给p2->next,
也就是将第3个结点链接到第二个结点之后,并使p2=p1,使p2指向最后一个结点。
再开辟一个新的结点并且使p1指向它,输入结点数据,由于p1->num的值为0,不再执行循环,此结点不应该被链接到链表之中。
此时将NULL赋值给p2->next。

*************************************************************************************************

建立链表的过程至此结束,p1最后所指的结点未链入链表之中,第3个结点的next成员值为NULL,不再指向任何结点。虽然p1指向新开辟的结点,
但从链表上无法找到该结点

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

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define LEN sizeof(struct Student)
struct Student//定义结构体。
{

int num;
float score;
struct Student *next;        //第二部分,既指向下一个结构体结点的首地址
};
int n;                           //全局变量的声明
struct Student *creat(void)          //结构体指针形参为void
{
struct Student *head;          //定义上述head指针和p1,p2指针
struct Student *p1, *p2;
n = 0;                          //头结点所对应的n=0.
p1 = p2 = (struct Student *) malloc(LEN);      //强制转化成结构体指针类型
//分配内存长度,返回值是一个名为Student的结构体指针,并且使p1和p2指向这个分配好的连续内存的首地址

cin >> p1->num >> p1->score;
//输入第一个结点的结构体信息

head = NULL;
//头结点的指针初始化为NULL.

while (p1->num != 0)   //第一个结点的num既学号不为0,则证明链表未结束
{
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
//否则的话就让第一个结点的结构体指针指向

p2 = p1;
//p2指向p1

p1 = (struct Student*)malloc(LEN);
//p1指向下一个开辟出来内存结点的首地址

cin >> p1->num >> p1->score;
}
p2->next = NULL;
return (head);//最后需要返回到整个链表的首地址,so,return (head);
}
void print(struct Student *head)//输出语句
{

struct Student *p;
printf("\nNow ,These %d records are:\n", n);

p = head;//先让p指向头地址
if (head != NULL)//如果头地址不是空的
do
{
printf("%ld %5.1f\n", p->num, p->score);
p = p->next;//让p指向他下面的p->next.
} while (p != NULL);
}
//主函数调用creat函数
int main()
{
print(creat());
return 0;
}


如需转载请声明本文原创地址:http://blog.csdn.net/u012485183/article/details/18304481
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐