链表——C语言

一、单项不带头

cpp 复制代码
#pragma once
#include<stdio.h>
#include<stdlib.h>

typedef int data;
typedef struct list
{
	data a;
	struct list* next;
}list;

list* buynode(data x);

void pushback(list** phead,data x);

void popback(list** phead);

void pushfront(list** phead, data x);

void popfront(list** phead);

list* find(list* head,data x);

void print(list* head);

//在pos之前插入
void insert1(list** pphead, list* pos,data x);

//在pos之后插入
void insert2(list** ppos,data x);

void erase(list** phead, list* pos);

void delete(list** phead);
cpp 复制代码
#include"list.h"

list* buynode(data x)
{
	list* newnode = (list*)malloc(sizeof(list));
	if (newnode == NULL)
	{
		perror("mallpc failure");
		return -1;
	}
	newnode->a = x;
	newnode->next = NULL;
	return newnode;
}

void pushback(list** phead, data x)
{
	list* cur = *(phead);
	while (cur->next != NULL)
	{
		cur = cur->next;
	}
	list* newnode = buynode(x);
	cur->next = newnode;
}

void print(list* head)
{
	list* cur = head;
	while (cur != NULL)
	{
		printf("%d ", cur->a);
		cur = cur->next;
	}
	printf("\n");
}

void popback(list** phead)
{
	list* cur = *(phead);
	while (cur->next->next != NULL)
	{
		cur = cur->next;
	}
	free(cur->next);
	cur->next = NULL;
}

void pushfront(list** phead, data x)
{
	list* cur = *(phead);
	list* newnode = buynode(x);
	newnode->next = cur;
	(*phead) = newnode;
}

void popfront(list** phead)
{
	list* cur = *(phead);
	(*phead) = cur->next;
	free(cur);
}

list* find(list* head,data x)
{
	list* cur = head;
	while ((cur->next) != NULL)
	{
		if (cur->a == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

void insert2(list** ppos, data x)
{
	list* newnode = buynode(x);
	list* cur = (*ppos)->next;
	(*ppos)->next = newnode;
	newnode->next = cur;
}

void erase(list** phead, list* pos)
{
	list* cur = *(phead);
	while (cur->next != pos)
	{
		cur = cur->next;
	}
	list* tmp = cur->next;
	cur->next = cur->next->next;
	free(tmp);
}


void insert1(list** pphead, list* pos, data x)
{
	list* cur = *(pphead);
	while (cur->next == pos)
	{
		cur = cur->next;
	}
	list* newnode = buynode(x);
	cur->next = newnode;
	newnode->next = pos;
}

void delete(list** phead)
{
	list* cur = (*phead);
	list* tmp = NULL;
	while (cur->next != NULL)
	{
		tmp = cur;
		cur = cur->next;
		free(tmp);
	}
	free(cur);
}
cpp 复制代码
#include"list.h"

int main()
{
	list* head = buynode(1);
	list** phead = &head;
	pushback(phead, 2);
	pushback(phead, 3);
	pushback(phead, 4);
	pushback(phead, 5);
	print(head);
	list* pos = find(head, 3);
	insert1(phead, pos, 10);
	insert2(phead, 20);
	print(head);
	delete(phead);
	return 0;
}

二、双向带头

cpp 复制代码
#pragma once
#include<stdio.h>
#include<stdlib.h>

typedef int data;
typedef struct list
{
	data a;
	struct list* prev;
	struct list* next;
}list;

list* buynode(data x);

list* init();

void destory(list** pphead);

void pushback(list** pphead, data x);

void popback(list** pphead);

void pushfront(list** pphead, data x);

void popfront(list** pphead);

list* find(list* phead, data x);

void insert1(list** pphead, data x,list** pos);

void insert2(list** pphead, data x,list** pos);

void erase(list** pphead, list** pos);

int size(list* phead);

void print(list* phead);
cpp 复制代码
#include"list.h"

list* buynode(data x)
{
	list* newnode = (list*)malloc(sizeof(list));
	if (newnode == NULL)
	{
		perror("malloc failure");
		return -1;
	}
	newnode->prev = NULL;
	newnode->next = NULL;
	newnode->a = x;
	return newnode;
}

list* init()
{
	list* phead = (list*)malloc(sizeof(list));
	if (phead == NULL)
	{
		perror("malloc failure");
		return -1;
	}
	phead->next = phead;
	phead->prev = phead;
	phead->a = 0;
	return phead;
}

void destory(list** pphead)
{

}

void pushback(list** pphead, data x)
{
	list* phead = *pphead;
	//只含头节点
	if (phead->next == phead && phead->prev == phead)
	{
		list* newnode = buynode(x);
		phead->prev = newnode;
		newnode->next = phead;
		phead->next = newnode;
		newnode->prev = phead;

		(*pphead)->a++;
	}
	//含有其他节点
	else
	{
		list* tail = phead->prev;
		list* newnode = buynode(x);
		tail->next = newnode;
		newnode->prev = tail;
		newnode->next = phead;
		phead->prev = newnode;

		(*pphead)->a++;
	}
}

void print(list* phead)
{
	list* cur = phead->next;
	while (cur != phead)
	{
		printf("%d ", cur->a);
		cur = cur->next;
	}
	printf("\n");
}

int size(list* phead)
{
	return phead->a;
}

void popback(list** pphead)
{
	list* phead = *pphead;
	list* tail = phead->prev;
	tail->prev->next = phead;
	phead->prev = tail->prev;
	free(tail);

	(*pphead)->a--;
}

void pushfront(list** pphead, data x)
{
	list* phead = *pphead;
	list* newnode = buynode(x);
	list* tmp = phead->next;
	phead->next = newnode;
	newnode->prev = phead;
	newnode->next = tmp;
	tmp->prev = newnode;

	(*pphead)->a++;
}

void popfront(list** pphead)
{
	list* phead = *pphead;
	list* tmp = phead->next;
	phead->next = tmp->next;
	tmp->next->prev = phead;
	free(tmp);

	(*pphead)->a--;
}

list* find(list* phead, data x)
{
	list* cur = phead->next;
	while (cur != phead)
	{
		if (cur->a == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

void insert1(list** pphead,data x, list** pos)
{
	list* newnode = buynode(x);
	list* pre = (*pos)->prev;
	
	pre->next = newnode;
	newnode->prev = pre;
	newnode->next = (*pos);
	(*pos)->prev = newnode;

	(*pphead)->a++;
}

void insert2(list** pphead, data x, list** pos)
{
	list* newnode = buynode(x);
	list* nex = (*pos)->next;

	nex->prev = newnode;
	newnode->next = nex;
	newnode->prev = (*pos);
	(*pos)->next = newnode;

	(*pphead)->a++;
}

void erase(list** pphead,list** pos)
{
	list* pre = (*pos)->prev;
	list* nex = (*pos)->next;
	pre->next = nex;
	nex->prev = pre;

	(*pphead)->a--;
}
cpp 复制代码
#include"list.h"

void test1()
{
	list* phead = init();
	list** pphead = &phead;
	pushback(pphead, 1);
	pushback(pphead, 2);
	pushback(pphead, 3);
	pushback(pphead, 4);
	pushback(pphead, 5);
	pushfront(pphead, 0);
	list* pos = find(phead, 3);
	erase(pphead, &pos);
	print(phead);
	printf("%d", size(phead));
}

int main()
{
	test1();
	return 0;
}
相关推荐
晊晌_h1 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
xiaobobo33301 小时前
c语言中for循环条件中定义临时栈变量的作用域
c语言·for循环条件定义栈变量·大括号作用域·独立栈变量
我找到地球的支点啦1 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
惜离殇2 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
潘潘的嵌入式日记3 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
xx~t5 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
lisin-lee-cooper7 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-7 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
羚尔8 小时前
C语言数组
c语言·开发语言
哭泣方源炼蛊8 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集