链表是一种基础且常见的数据结构,运用结构体指针实现。链表可以进行动态存储分配,也可以进行静态存储。链表是一个功能强大的数组,链表可以实现随意的增添、删除、插入结点。我们熟悉的学生管理系统大部分都是基于链表实现的,现在,我们在实现链表的基础上实现一个简易的学生管理系统。
链表的实现(创建链表、创建结点、增添结点、删除结点、打印)可以分为5个步骤
先定义一个Node结构体
struct Node{
int data;//数据域
struct Node* next;//指针域
};
1、创建链表
struct Node* createList(){
//创建链表
struct Node* headNode;//定义一个头指针
headNode = (struct Node*)malloc(sizeof(struct Node));//动态申请内存
//使用动态申请内存时要导入<stdlib.h>头文件
//初始化头指针即headNode->data,headNode->next;
//但多数情况下数据域headNode->data不用初始化也可以
headNode->data=1;
headNode->next=NULL;//头链表指向空
return headNode;//将创建好的链表返回
}
2、创建结点
struct Node* createNode(int data){
//和创建链表一样
struct Node* headNode ;
headNode = (struct Node* )malloc(sizeof(struct Node));
headNode->data = data;
headNode->next = NULL;
return headNode;
}
3、增添(插入)结点
通过下图可以看出,插入结点就是用插入前结点的指针域链接上结点的数据域,再把插入结点的指针域链接插入后结点的数据域。
即 newNode->next = headNode->next;
headNode->next = newNode;
void insertNode(struct Node* headNode,int data){
//
struct Node* newNode = createNode(data);//通过前面定义的结点创建函数来实现
newNode->next = headNode->next;
headNode->next = newNode;
}
4、删除结点
删除结点就是把前结点的指针域越过要删除的结点指向下下个结点。
即
posNodeFront->next=posNode->next 最后释放posNode空间free(posNode);
void deleteNode(struct Node* headNode,int data){
struct Node* posNode = headNode->next;//后一个结点
struct Node* posNodeFront = headNode;//前一个结点
if(NULL == posNode){
//如果后一个结点为空则退出
return ;
}
else{
while(posNode->data != data){
//如果有这个数就跳过
posNodeFront = posNode; //前一个结点和下下个相链接
posNode= posNodeFront->next;//前一个结点的next链接后一个结点的数据