- 创建新链表
- 在已有链表的基础上将原链表内容倒序
使用链表和结构体实现对学生宿舍信息的录入,学生的信息包括:
- 姓名
- 学号
- 年龄
- 性别
- 宿舍号
- 床号
并且实现如下功能:
-
录入:
通过键盘录入每个学生的具体信息
-
输出:
遍历整个链表将所有学生信息输出
-
查询:
按学号进行查询,并输出该学生的所有信息
-
插入:
录入学生信息,并将该学生插入到链表的指定位置
-
删除: 删除指定位置上的学生信息
-
使用文件存储整个链表的所有学生信息
-
在运行时主动判断是否已有保存的文件,如果有就从文件中输入,恢复之前的链表,输出学生信息
链表创建的步骤简介 (以下代码仅供参考):
- 首先构造学生的结构体
// 这里只定义一个数据
typedef struct Student_info{
int a; //这里先定义一个int型的数据
struct Student_info *next; //定义结构体指针
} Stu;
-
动态创建
这里写了一个结构体中只有一个数据的链表的创建的例子: 首先从键盘获取想要录入的学生个数 m 创建链表需要三个指针,p_head指向头节点,p_new指向新创建结构体,q指针用于连接链表 for(int i = 0;i < m;i ++) { int data = 0; //定义常量用来保存结构体里的信息,这里只有 a scanf("%d",&data); p = (Stu *)malloc(sizeof(Stu)); p->a = data; //为新开辟结点赋值 p->next = NULL; if(a == 1) //如果是第一个结点,即链表还没有形成,p_head跟q都指向p,因为只有一个节点; { p_head = p; q = p; } else { q->next = p; //链表已经存在,就将q的next指针指向新开辟的新的结构体 q = p; //将指针q指向p,也就是现在这个链表的最后一个结点,用于下次循环,链接新的结点 } } //这样就创建了一个储存了m个学生信息的链表,这里的学生信息只有一个a,只做演示
-
遍历输出
仿照这个例子: void printf(Stu *p_head) //传入链表的头节点 { Stu *p = p_head; //定义结构体指针指向头节点 if(p)//想一下这里,是p还是p->next { printf("链表为空!\n"); exit(0); } //如果到最后一个结点,while(p)还是ture,然后打印出最后一个结点的值,p = p->next(NULL) //之后就跳出循环 while(p) { printf("%d ",p->a); p = p->next; } printf("\n"); } //这样就打印出了链表中的信息
-
查询
仿照下面的这个例子: void (Stu *p_head,int a) //在链表中查找值为a的结点,并打印全部所属信息 { Stu *p = p_head; while(p && p->a != a) p = p->next; printf("%d...",p->a...); }