自己带头结点的链表学习的一个记录
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//函数声明(写主函数前面方便调用)
//插入
void Insert(struct LinkNode* header, int oldval, int newval);
//遍历
void bianli(struct LinkNode* header);
//删除
void delet(struct LinkNode* header, int val);
//清除链表
void clear(struct LinkNode* header);
//结点内部
struct LinkNode
{
int data;
struct LinkNode* next;
//下一个结点地址
};
//初始化链表
struct LinkNode* LinkList()
{
//创建头结点
struct LinkNode* header = (struct LinkNode*)malloc(sizeof(struct LinkNode));
header->data = -1;//这个数据随便写,不写也可以
header->next = NULL;
//辅助指针变量(尾部指针)
struct LinkNode* phou = header;
//用户数据输入
int val = -1;
while (1)//直到输入数字-1结束
{
printf("输入数据:\n");
scanf_s("%d", &val);
if (val == -1)
{
break;
}
//创建新节点
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = val;
newnode->next = NULL;
//将新节点插入到链表中
phou->next = newnode;
phou = newnode;
}
return header;
}
//在值为ordval的前面插入一个新的数据newval
void Insert(struct LinkNode* header, int oldval, int newval)
{
//判断链表是否为NULL
if (NULL == header)
{
return;
}
//建立两个辅助指针变量
struct LinkNode* pqian = header;
struct LinkNode* phou = pqian->next;
while (phou != NULL)
{
if (phou->data == oldval)
{
break;
}
pqian = phou;
phou = phou->next;
//移动两个辅助指针,使前面的指针指向后面一个结点,后结点指向后指针的下一个结点。
}
if (phou == NULL)
{
return;//phou等于0说明链表中不存在该结点
}
//建立新结点储存数据
struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//将新节点插入到链表中
pqian->next = newnode;
newnode->next = phou;
}
//遍历链表
void bianli(struct LinkNode* header)
{
if (header == NULL)
{
return;
}
struct LinkNode* phou = header->next;
while (phou != NULL)
{
printf("%d\n", phou->data);
phou = phou->next;
}
}
//删除值为val的结点
void delet(struct LinkNode* header, int val)
{
if (header == NULL)//判空
{
return;
}
//创建两个辅助指针
struct LinkNode* pqian = header;
struct LinkNode* phou = pqian->next;
while (phou != NULL)
{
if (phou->data == val)
{
break;
}
pqian = phou;
phou = phou->next;
}
if (phou == NULL)
{
return;
}
pqian->next = phou->next;
//使前一个指针的下一个指向下一个结点的下一个,从而使后指针从链表中脱落
free(phou);//释放后指针内存
phou = NULL;
}
void clear(struct LinkNode* header)
{
if (header == NULL)
{
return;
}
//辅助指针变量
struct LinkNode* phou = header->next;//这是清空不是要把头结点干掉所以不能写header
while (phou != NULL)
{
//清空前需要保存当前结点的下一个结点地址(next),否则会找不到下一个结点的位置无法继续释放
struct LinkNode* pnext = phou->next;
free(phou);
phou = pnext;
}
}