c语言实现链表的(创建、插入、删除、查改.....)

#pragma once
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
//struct node {
//	int date;
//	struct node *next;
//};
typedef int DateType;
typedef struct ListNode {
	DateType data;
	struct ListNode *next;
}ListNode;
//初始化/销毁
void Listlnit(ListNode **ppFirst)
{
	assert(ppFirst != NULL);
	*ppfirst = NULL;
}
void ListDestroy(ListNode   **ppFirst)
{
	*ppFirst = NULL;
}
//增删查改
static Listnode *CreateNode(DateType date)
{
	ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
	assert(newNode);
	newNode->date = date;
	newNode->next = NULL;
	return newNode;
}
void ListPushFront(ListNode **ppFirst, DataType date)
{
	asser(ppFirst != NULL);
	//考虑特殊情况,链表为空*ppFirst ==NULL
	//正常情况

	//1.指针vs 指向空间;从堆上申请空间
	ListNode *newNode = CreateNode(date);
	newNode->next = *ppFirst;
	*ppFirst = newNode;
}
void ListpushBack(ListNode **ppFirst, DateType date) {
	ListNode *newNode = CreateNode(date);
	特殊情况,找到第一个->至少有一个,所以特殊情况是链表为空
		if (*ppFirst == NULL) {
			*ppFirst = newNode;
			return;
		}
	//通常情况
	ListNode *cur = *ppFirst;
	while (cur->next != NULL) {
		cur = cur->next;
	}
	//cur就是最后一个结点
	cur->next = newNode;
}
//删除
void ListPopFront(ListNode **ppFirst)
{
	asser(ppFirst != NULL);//变量地址不为空
	assert(*ppFirst != NULL);//不能是空链表
	ListNode *del = *ppFirst;
	*ppFirst = del->next;
	free(del); 
}
void ListPopBack(ListNode **ppFirst)
{
	assert(ppFirst != NULL) {
		free(*ppFirst);
		*ppFirst = NULL;
		return;
	}
	//正常情况
	ListNode *del;
	ListNode *cur = *ppFirst;
	while (cur->next->next != NULL) {
		cur = cur->next;
	}
	del = cur->next;
	cur->next = NULL;
	free(del);

}

//查找
ListNode *ListFind(ListNode *first, DateType date)
{
	//顺序查找, 去遍历
	for (ListNode *cur = first;cur != NULL;cur = cur->next)
	{
		if (date == cur->date) {
			return cue;
		}
	}
	retrn NULL;
}
//在结点前插入 (结点pos肯定在链表中&&pos不是空“链表不为空”
void Listlnsert(ListNode **ppFirst, ListNode *pos, DateType date)
{
	//头插
	if (*ppFirst == pos)
	{
		ListPushFront(ppFirst, date);
		return;
	}
	ListNode *cur = *ppFirst;
	//找pos的前一个结点
	while (cur->next != pos) {
		cur = cur->next;
	}
	//插入新结点
	ListNode *newNode = CreateNode(date);
	//一定要申请空间
	newNode->next = cur->next;//pos
	cur->next = newNode;


}

//删除指定结点(结点pos坑定在链表中&&pos不是空【链表不是空】
void ListErase(ListNode **ppFirst, ListNode *pos)
{
	//头删
	if (*ppFirst == pos) {
		ListPopFront(ppFirst);
		return;//记得return,否则下面加上else

	}
	LisNode *cur = ppFirst;
	//找pos的前一个结点
	while (cur->next != pos) {
		cur = cur->next;
		free(pos);
		//记得
	}
	void Test()
	{
		ListNode *first;
		Listlnit(&first);//传值1.first 传地址 2.&first
		//链表是一条空链表,first==NULL;
		//first会变化
		ListPushBack(&first, 1);
		//以后first不变
		ListPushBack(&first, 2);
		ListPushBack(&first, 3);
		ListNode *result = ListFind(find, 2);
		Listlnsert(&first, result, 0);
	}

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/82823591