栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

双向循环链表的C语言实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

双向循环链表的C语言实现

在工作中的项目有用到双链表,尤其是跟着别人写双链表代码的思路,自己去看总觉得没那么顺,感觉以后也会经常用到,所以索性自己写一个出来,细节由自己去把握,终于是理解了这一块,以下是实现双链表的所有源码:

#include 
#include  

typedef struct List
{
	struct List *pre;
	struct List *next;
	int data;
}List_t;

typedef struct HeadNode
{
	int nodeLenth;
	List_t *headNode;
}HeadNode_t;

//初始化头结点 
HeadNode_t g_headNode = {
    .nodeLenth = 0,
    .headNode = NULL,
};

//双向循环链表 
//插入结点 
void InsertNode(List_t *ListMember)
{
	unsigned char i = 0;
	if(g_headNode.nodeLenth == 0) {   //插入的第一个结点当做头结点 
	    g_headNode.nodeLenth++;
		g_headNode.headNode = ListMember;
		g_headNode.headNode->next = ListMember;    //第一个结点的next指向自己,主要是为了构成双向循环链表 
		g_headNode.headNode->pre = ListMember;     //第一个结点的pre指向自己 
		return;
	}
	
	g_headNode.nodeLenth++;
	List_t *tempNode = g_headNode.headNode->pre;  //tempNode永远表示链表的最后一个节点       
	
	tempNode->next = ListMember;                 //插入的结点放到最后 
	g_headNode.headNode->pre = ListMember;
	ListMember->next = g_headNode.headNode;
	ListMember->pre = tempNode;
	
	tempNode = g_headNode.headNode;              //打印结点 
	for(i = 1; i <= g_headNode.nodeLenth; i++) {
		printf("The data%d is %dn", i, tempNode->data);
		tempNode = tempNode->next;
	}
}

//根据数据找到结点 
List_t* FindDataNode(int data)
{
	unsigned char i;
	List_t *tempNode = g_headNode.headNode;
	for(i = 0; i < g_headNode.nodeLenth; i++) {
		if(tempNode->data == data) {
			return tempNode;
		}
		tempNode = tempNode->next;
	}
	return NULL;
}

//删除结点 
void DelDataNode(int data)
{
	unsigned char i = 0;
	List_t *DelNode = FindDataNode(data);
	g_headNode.nodeLenth--;
	if(DelNode == g_headNode.headNode) {     //如果删除的是头结点 
		g_headNode.headNode->pre->next = DelNode->next;
		g_headNode.headNode->next->pre = DelNode->pre;
		g_headNode.headNode = DelNode->next;
		
		for(i = 1; i <= g_headNode.nodeLenth; i++) {
			printf("After del HeadNode, the data%d is %dn", i, DelNode->next->data);
			DelNode = DelNode->next;
		}
		return;
	}
	DelNode->next->pre = DelNode->pre;       //删除结点的具体操作 
	DelNode->pre->next = DelNode->next;
	
	DelNode = g_headNode.headNode;
	for(i = 1; i <= g_headNode.nodeLenth; i++) {
		printf("The data%d is %dn", i, DelNode->data);
		DelNode = DelNode->next;
	}
}

//设置结点为头结点 
void SetHeadNode(int data)
{
	List_t *TempNode = FindDataNode(data);
	g_headNode.headNode = TempNode;
}

int main(void) 
{
	List_t *listMember1 = NULL;
	listMember1 = (List_t *)malloc(sizeof(List_t));
	listMember1->data = 18;
	listMember1->next = NULL;
	listMember1->pre = NULL;
	
	List_t *listMember2 = NULL;
	listMember2 = (List_t *)malloc(sizeof(List_t));
	listMember2->data = 19;
	listMember2->next = NULL;
	listMember2->pre = NULL;
	
	List_t *listMember3 = NULL;
	listMember3 = (List_t *)malloc(sizeof(List_t));
	listMember3->data = 20;
	listMember3->next = NULL;
	listMember3->pre = NULL;
	
	List_t *listMember4 = NULL;
	listMember4 = (List_t *)malloc(sizeof(List_t));
	listMember4->data = 21;
	listMember4->next = NULL;
	listMember4->pre = NULL;
	
	List_t *listMember5 = NULL;
	listMember5 = (List_t *)malloc(sizeof(List_t));
	listMember5->data = 22;
	listMember5->next = NULL;
	listMember5->pre = NULL;
	
	List_t *listMember6 = NULL;
	listMember6 = (List_t *)malloc(sizeof(List_t));
	listMember6->data = 23;
	listMember6->next = NULL;
	listMember6->pre = NULL;	
	
	InsertNode(listMember1);
	InsertNode(listMember2);
	InsertNode(listMember3);
	InsertNode(listMember4);
	InsertNode(listMember5);
	InsertNode(listMember6);

    DelDataNode(18);
    SetHeadNode(22);
    DelDataNode(22);
    
	printf("The lenth is %dn", g_headNode.nodeLenth);
	
	free(listMember1);
	free(listMember2);
	free(listMember3);
	free(listMember4);
	free(listMember5);
	free(listMember6);
	return 0;
}

若是大家有其他想法或者有发现错误,欢迎指正哈~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433328.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号