IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单向(循环)链表、双向(循环)链表 -> 正文阅读

[数据结构与算法]单向(循环)链表、双向(循环)链表

链表总结

单向链表

单向循环链表

双向链表

双向循环链表

设计节点

struct list_node{

int data;

struct list_node* next;

}

struct list_node{

int data;

struct list_node* next;

}

struct list_node{

int data;

struct list_node* next;

struct list_node* prev;

}

struct list_node{

int data;

struct list_node* next;

struct list_node* prev;

}

初始化头节点

为头节点申请空间,数据域无效

head -> next = NULL;

为头节点申请空间,数据域无效

head -> next = NULL;

为头节点申请空间,数据域无效

head -> next = NULL;

head -> prev = NULL;

为头节点申请空间,数据域无效

head -> next = head;

head -> prev = head;

尾插数据

为新节点申请空间,数据域由用户赋值

new->data = data;

new -> next = NULL;

for(p=head;p->next!= NULL;p=p->next);

p->next=new;

为新节点申请空间,数据域由用户赋值

new->data = data;

new -> next = NULL;

for(p=head;p->next!= head;p=p->next);

p->next=new;

为新节点申请空间,数据域由用户赋值

new ->data = data;

new ->next = NULL;

for(p=head;p->next !=NULL;p=p->next);

p->next=new;

new->prev=p;

为新节点申请空间,数据域由用户赋值

new->data = data;

new ->next=head;

struct list_node * p=head->prev;

p->next=new;

new->prev=p;

head->prev = new;

头插数据

为新节点申请空间,数据域由用户赋值

new->next = head->next;

head->next = new;

为新节点申请空间,数据域由用户赋值

new->next = head->next;

head->next = new;

为新节点申请空间,数据域由用户赋值

new ->next=head->next;

new->prev=head;

if(head->next!=NULL)

{

head->next->prev=new;

}

head->next = new;

为新节点申请空间,数据域由用户赋值

new->next =head->next;

new->prev=head;

head->next->prev=new;

head->next=new;

往后遍历

struct list_node *p=NULL;

for(p=head->next;p!=NULL;p=p->next)

{

打印内容;

}

struct list_node *p=NULL;

for(p=head->next;p!=head;p=p->next)

{

打印内容;

}

struct list_node *p = NULL;

for(p=head->next;p!=NULL;p=p->next)

{

打印内容;

}

struct list_node *p=NULL;

for(p=head->next;p!=head;p=p->next)

{

打印内容;

}

往前遍历

struct list_node *p = NULL;

for(p=head;p->next!=NULL;p=p->next)

for(;p!=head;p=p->prev)

{

打印内容;

}

struct list_node *p=NULL;

p=head->prev;

for(;p!=head;p=p->prev)

{

打印内容;

}

删除链表

struct list_node *p=NULL;

struct list_node *q=NULL;

for(q=p=head;p!=NULL;p=q)

{

q=p->next;

free(p);

}

struct list_node *p=NULL;

struct list_node *q=NULL;

for(p=head;p->next!=head;p=p->next);

p->next = NULL;

for(q=p=head;p!=head;p=q)

{

q=p->next;

free(p);

}

struct list_node *p=NULL;

struct list_node *q=NULL;

for(q=p=head;p!=NULL;p=q)

{

q=p->next;

free(p);

}

struct list_node *p=NULL;

struct list_node *q=NULL;

p=head->prev;

p->next=NULL;

for(q=p=head;p!=NULL;p=q)

{

q=p->next;

free(p);

}

单向链表

#include <stdio.h>
#include <stdlib.h>
/*
*
*	单向链表 增删改查
*
*/


/*	节点	*/
typedef struct list_node
{
	int data;
	struct list_node *next;
}list_node, *list;

/*	头节点初始化函数	*/
list list_init(void)
{
	list head = malloc(sizeof(list_node));
	if (head == NULL)
	{
		printf("malloc head fail!\n");
		return 0;
	}
	head->next = NULL;
	return head;
}

/*	插入尾部节点函数	*/
void insert_list_tail(list head, int data)
{
	list new = malloc(sizeof(list_node));
	/*找到当前链表最后一个节点*/
	list p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	p->next = new;

	new->data = data;
	new->next = NULL;
	return;
}

/*	插入节点在链表头部	*/
void insert_list_head(list head, int data)
{
	list new = malloc(sizeof(list_node));

	new->data = data;
	new->next = head->next;
	head->next = new;
	return;
}

/*		删除节点	*/
void delete_node(list head, int data)
{
	list p = head->next;
	list tmp = head;
	while (p != NULL)
	{
		if (p->data == data)
		{
			printf("p -> %d delete success!\n", p->data);
			tmp->next = p->next;
			free(p);
			return;
		}
		tmp = p;
		p = p->next;
	}
	printf("no data ! delete fail!\n");
	return;
}

/* 查找节点 */
void search_node(list head, int data)
{
	list p = head->next;
	while (p != NULL)
	{
		if (p->data == data)
		{
			printf("p -> %d search success!\n", p->data);
			return;
		}
		p = p->next;
	}
	/*	遍历链表没找到	*/
	printf("search fail!\n");
	return;
}

/*	删除整个链表	*/
void delete_list(list head)
{
	list p = head;
	list q = head;
	while (p != NULL)
	{
		p = p->next;
		free(q);
		q = p;
	}
	printf("delete list success!\n");
	return;
}


/*	打印链表	*/
void printf_list(list head)
{
	list tmp = head->next;
	/*	判断是否为空	*/
	if (tmp == NULL)
	{
		printf("NULL!");
		return;
	}
	while (tmp != NULL)
	{
		printf("%d", tmp->data);
		tmp = tmp->next;
		if (tmp != NULL)
		{
			printf(" -> ");
		}
	}
	printf("\n");
	return;
}

int main(int argc, char *argv[])
{
	/*初始化头节点*/
	list head = list_init();
	printf_list(head);
	return 0;
}

单向循环链表

#include <stdio.h>
#include <stdlib.h>

/*
*	单向循环链表 增删改查
*/


/* 节点*/
typedef struct list_node 
{
	int data;
	struct list_node* next;
}list_node,*list;

/*列表初始化*/
list init_list(void)
{
	list head = malloc(sizeof(list_node));
	if (head == NULL)
	{
		printf("head malloc fail!\n");
		return 0;
	}
	head->next = head;
	return head;
}

/*插入头节点*/
void insert_node_head(list head,int data)
{
	list new = malloc(sizeof(list_node));
	if (new == NULL)
	{
		printf("new node malloc fail!\n");
		return 0;
	}
	new->data = data;
	new->next = head->next;
	head->next = new;
	return;
}

/*插入尾节点*/
void insert_node_tail(list head,int data)
{
	list new = malloc(sizeof(list_node));
	if (new == NULL)
	{
		printf("new node malloc fail!\n");
		return 0;
	}

	/*找到最后一个节点(指向头节点)*/
	list tmp = head;
	while (tmp->next != head)
	{
		tmp = tmp->next;
	}
	new->data = data;
	new->next = head;
	tmp->next = new;
}

void delete_node(list head,int data)
{
	list p = head->next;
	list q = head;
	while (p != head)
	{
		if (p->data == data)
		{
			printf("p -> %d delete success!\n", p->data);
			q->next = p->next;
			free(p);
			return;
		}
		q = p;
		p = p->next;
	}
	printf("delete fail!\n");
	return;
}

void printf_list(list head)
{
	list tmp = head->next;
	while (tmp != head)
	{
		printf("%d", tmp->data);
		if (tmp->next != head)
		{
			printf("->");
		}
		tmp = tmp->next;
	}
	printf("\n");
}
int main(int argc, char* argv[])
{
	list head;
	head = init_list();

	/*插入尾节点*/
	insert_node_tail(head, 50);
	insert_node_tail(head, 60);
	insert_node_tail(head, 70);

	/*插入头节点*/
	insert_node_head(head,40);
	insert_node_head(head,30);
	insert_node_head(head,10);

	/*打印链表*/
	printf_list(head);

	delete_node(head, 30);
	delete_node(head, 40);
	printf_list(head);
	delete_node(head, 6);
}

双向链表

#include <stdio.h>
#include <stdlib.h>

/*
*	双向链表
*   注意 双向链表头插法只有头节点时情况
*/
typedef struct list_node {
	int data;
	struct list_node* next;
	struct list_node* prev;
}list_node,*list;

list init_list(void)
{
	//头节点申请空间
	list head = NULL;
	head = malloc(sizeof(list_node));
	if (NULL == head)
	{
		printf("head_node malloc fail!\n");
		return 0 ;
	}

	//头节点赋值
	head->next = NULL;
	head->prev = NULL;

	//返回头节点
	return head;
}

/*头插数据*/
void insert_data_to_list_head(list head, int data)
{
	//新节点申请空间
	list new = malloc(sizeof(list_node));
	if (NULL == new)
	{
		printf("new_node malloc fail!\n");
		return;
	}

	new->data = data;

	new->next = head->next;  
	//双向链表头插注意只有头节点时情况
	if (head->next != NULL) {
		head->next->prev = new;
	}
	new->prev = head;
	head->next = new;
}
/*尾插数据*/
void insert_data_to_list_tail(list head, int data)
{
	//新节点申请空间
	list new = malloc(sizeof(list_node));
	if (NULL == new)
	{
		printf("new_node malloc fail!\n");
		return;
	}

	//赋值
	new->data = data;
	
	//遍历找最后一个节点
	list p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	new->next = p->next;
	new->prev = p;
	p->next = new;
}

void delete_node(list head, int data)
{
	list tmp = head->next;
	while (tmp != NULL)
	{
		if (tmp->data == data)
		{
			tmp->prev->next = tmp->next;
			if (tmp->next != NULL) {
				tmp->next->prev = tmp->prev;
			}
			free(tmp);
			return ;
		}
		tmp = tmp->next;
	}
}

void delete_list(list head)
{
	list p = head;
	list q = head;
	while (p != NULL)
	{
		p = p->next;
		free(q);
		q = p;

	}
}
/*遍历数据*/
void show_list(list head)
{
	list p = head->next;
	while (p != NULL)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}

/*反向遍历*/
void show_list2(list head) 
{
	list p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}

	while(p!=head)
	{
		printf("%d\t", p->data);
		p = p->prev;
	}
	printf("\n");

}
int main()
{
	list head = init_list();
	insert_data_to_list_head(head,30);
	insert_data_to_list_head(head,20);
	insert_data_to_list_head(head,10); 
	show_list(head);
	delete_node(head, 20);
	show_list(head);
	delete_list(head);
	show_list(head);
	return 0;
}

双向循环链表

#include <stdio.h>
#include <stdlib.h>

/*
*	双向循环链表
*/
typedef struct list_node {
	int data;
	struct list_node* next;
	struct list_node* prev;
}list_node,*list;

list init_list(void)
{
	//头节点申请空间
	list head = NULL;
	head = malloc(sizeof(list_node));
	if (NULL == head)
	{
		printf("head_node malloc fail!\n");
		return 0 ;
	}

	//头节点赋值
	head->next = head;
	head->prev = head;

	//返回头节点
	return head;
}

/*头插数据*/
void insert_data_to_list_head(list head, int data)
{
	//新节点申请空间
	list new = malloc(sizeof(list_node));
	if (NULL == new)
	{
		printf("new_node malloc fail!\n");
		return;
	}
	new->data = data;
	new->next =head->next;
	new->prev=head;
	head->next->prev=new;
	head->next=new;
}
/*尾插数据*/
void insert_data_to_list_tail(list head, int data)
{
	//新节点申请空间
	list new = malloc(sizeof(list_node));
	if (NULL == new)
	{
		printf("new_node malloc fail!\n");
		return;
	}
	new->data = data;
	new ->next=head;
	list p=head->prev;
	p->next=new;
	new->prev=p;
	head->prev = new;
}

void delete_node(list head, int data)
{
	list tmp = head->next;
	while (tmp != head)
	{
		if (tmp->data == data)
		{
			tmp->prev->next = tmp->next;
			tmp->next->prev = tmp->prev;
			free(tmp);
			return ;
		}
		tmp = tmp->next;
	}
}

void delete_list(list head)
{
	struct list_node *p=NULL;
	struct list_node *q=NULL;
	p=head->prev;
	p->next=NULL;
	for(q=p=head;p!=NULL;p=q)
	{
	q=p->next;
	free(p);
	}
}
/*遍历数据*/
void show_list(list head)
{
	list p = head->next;
	while (p != head)
	{
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n");
}

/*反向遍历*/
void show_list2(list head) 
{
	list p = head->prev;
	for(;p!=head;p=p->prev)
	{
		printf("%d\t", p->data);
	}
	printf("\n");
}

int main()
{
	list head = init_list();
	insert_data_to_list_head(head,30);
	insert_data_to_list_head(head,20);
	insert_data_to_list_head(head,10); 
	show_list(head);
	delete_node(head, 20);
	show_list(head);
	insert_data_to_list_head(head, 5);
	insert_data_to_list_head(head, 15);
	delete_node(head, 30);
	show_list(head);
	delete_list(head);
	return 0;
}

运行结果

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 02:14:52  更:2022-09-15 02:16:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 18:45:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码