带头结点链表

71 阅读2分钟

自己带头结点的链表学习的一个记录

//头文件
#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;
	}
}