C语言学生管理系统(准备工作2)(有空头单链表-创建节点-头尾添加)
单链表
说实话写这个时候心里是没底的,因为我也是刚刚学会没多久,仅仅是保证运行不出错,也不清楚自己理解了多少,但还是决定把现阶段自己所理解的都总结下来,也方便以后查缺补漏,话不多说,开始吧!
首先回想一下链表的样子:
链表不同于数组,它没有索引(下标),所以当我们需要使用链表的时候,总是要从第一个节点开始遍历,到最后一个节点(指针指向NULL的节点)结束。
所以我们一般会用两个指针指向这两个节点——头节点和尾节点,也就是头指针和尾指针,而在具体应用过程中,可以让头指针指向第一个装有数据的节点(这样它就是头节点了),也可以单独给头指针创建一个不装数据的节点(专门作为头节点)。
像这样的 第一种情况就是无空头的链表
第二种就是有空头的链表
我试着画一下:
无空头链表
有空头链表
我下面总结的是有空头的链表,它比较好理解也更好操作一些,首先需要声明节点结构体,如下:
struct Node { int data; //数据 struct Node* pNext; //指针 };
然后定义头尾指针并赋空:
struct Node* Head = NULL; struct Node* End = NULL;
在使用时,还要需要在主函数中为头指针创建一个节点(空头),将指针赋空,为了方便操作,顺便让尾节点也等于它。
int main(void) { Head = (struct Node*)malloc(sizeof(struct Node)); Head->pNext = NULL; End = Head; system("pause"); return 0; }
这样,写一个链表的准备工作就准备好了,接下来就是去写各种各样的函数来实现各种功能了,链表的基本操作是“增删改查”,下面我一个一个总结。
向链表中添加节点有三种方法,头添加、尾添加和在指定位置添加(在指定位置之前或之后,有自己决定……或者你也可以两种都写)
其实单看名字就已经很好理解了,但我还是画上三张图吧:
尾添加
头添加
注意操作顺序是先连后断,如果先让Head->pNext指向pTemp的话,就没办法找到Head的下一个了,因为此时那根“链”已经断了
理解了头添加的话,在指定位置添加也就简单很多了
在指定位置添加
看完了上面三种添加方法,你会发现他们都需要创建一个新的节点pTemp,想象这三种方法我们都需要使用,那同样的创建节点我们就要写三遍了,所以不如干脆把它拿出来重新写一个函数,创建一个节点并返回就好了:
struct Node* CreateNode(int a) { struct Node*pTemp= (struct Node*)malloc(sizeof(struct Node)); pTemp->data = a; pTemp->pNext = NULL; return pTemp; }
今天就暂时总结这么多吧,下面是具体所有代码(这里我没有写在指定位置添加,明天我会把它和选择指定节点一起写出来):
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Node { int data; //数据 struct Node* pNext; //指针 }; struct Node* Head = NULL; struct Node* End = NULL; struct Node* CreateNode(int a); void AddList_Head(int a); void AddList_Tail(int a); void ScanList(); int main(void) { Head = (struct Node*)malloc(sizeof(struct Node)); Head->pNext = NULL; End = Head; AddList_Tail(1); AddList_Tail(3); AddList_Tail(5); AddList_Head(7); AddList_Head(9); ScanList();//这是遍历输出链表中所有节点的内容,今天没有写,主要是为了演示结果 system("pause"); return 0; } struct Node* CreateNode(int a) { struct Node*pTemp= (struct Node*)malloc(sizeof(struct Node)); pTemp->data = a; pTemp->pNext = NULL; return pTemp; } void AddList_Head(int a) { struct Node* pTemp = CreateNode(a); pTemp->pNext = Head->pNext; Head->pNext = pTemp; } void AddList_Tail(int a) { struct Node* pTemp = CreateNode(a); End->pNext = pTemp; End = pTemp; }
这是三次尾添加和两次头添加的结果
可以看到头添加之后的顺序都是反的,所以我们一般都使用尾添加。
嘿嘿,未完待续~~
- 点赞
- 收藏
- 分享
- 文章举报
- C语言学生管理系统(准备工作3)(遍历链表 寻找指定节点 添加 )
- C语言学生管理系统(准备工作4)(链表的三种删除)
- 学生成绩管理系统 C语言链表版本
- C语言创建简单学生成绩管理系统(数组)
- c语言制作的学生成绩管理系统 加链表
- 【C语言】指针、链表的原理和各类操作相关心得以及学生信息管理系统的改写报告
- C语言的指针、链表的原理和各类操作以及学生信息管理系统改进报告
- C语言链表实现学生管理系统
- C语言基于单链表得学生成绩管理系统
- C语言学生信息管理系统(单链表)
- 学生成绩管理系统课程设计(C语言,链表实现)
- c语言基于链表的学生信息管理系统(源代码)
- 学生工作管理系统(C语言实现)
- 就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会,并将学生信息管理系统进行修改,使能完成其他的功能,并撰写体会,附加源代码。
- C语言实现学生信息管理系统(单链表)
- C语言用链表做的学生管理系统
- C语言单链表实现学生管理系统(增删改查)
- 学生成绩管理系统—C语言链表表实现 数据库的数据项主要数据包括:学号、姓名、年级、专业、成绩1、成绩2、成绩3、平均成绩、总成绩。
- C语言链表做的学生管理系统,但是运行不出来
- 黑马程序员-c语言链表-学生管理系统(Q)