链表基础与解析//建立一个拥有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指向新开辟的结点,
但从链表上无法找到该结点
************************************************************************************************/
如需转载请声明本文原创地址:http://blog.csdn.net/u012485183/article/details/18304481
************************************************************************************************
//建立一个拥有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
相关文章推荐
- c语言:写一个函数建立一个有3名学生数据的单向动态链表
- c语言:写一个函数建立一个有3名学生数据的单向动态链表
- 例 9.8 建立一个如图9.9所示的简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据。
- 建立一个简单的链表,它由三个学生数据的结点组成输出各节点中的数据。
- 编写程序:建立一个学生数据链表,每个节点的信息包括如下内容:学号,姓名,性别年龄专业。对链表做如下处理。输入一个学号(专业),如果链表中的节点包含此学号(专业),则删去该结点。
- 建立一个对象数组,内放5个学生的数据(学号、成绩)
- 建立一个数组,内存放5个学生的数据(学号、成绩),用指针指向数组首元素,输出1、3、5学生的数据
- 最基础的动态数据结构:链表
- 【4.17】建立一个对象数组,内放6个学生的数据(学号、成绩),用指针指向数组首元素,输出第2,4,6个学生的数剧。
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 建立一个对象数组,内放5个学生数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并从输出学号。
- c语言:建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据
- 数据结构(头插法建立一个链表)
- (建立静态链表)由3个学生数据的结点组成,要求输出各结点中的数据
- 如何动态建立一个DataTable并且为之添加数据
- 程序员面试宝典之数据结构基础----⑥双链表的建立,插入和删除
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- 用一个异质链表(多态性)保存学生数据
- 一个数据链表的建立
- 用一个异质链表(多态性)保存学生数据