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

带头结点的双向链表示例(c)

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

带头结点的双向链表示例(c)

#include 
#include 
#include 

typedef struct DLnode
{
	int data;               //数据域
	struct DLnode *pre;     //前驱指针
	struct DLnode *next;    //后继指针
}Dnode, * Dlinklist;

Dlinklist Init_DlinkList(void);                      //初始化双链表
Dlinklist Creat_newNode(int DATA);                   //创建一个新节点
void Insert_head_DlinkList(Dlinklist DL, int DATA);  //头插
void Delete_head_DlinkList(Dlinklist DL);            //头删
void Insert_tail_DlinkList(Dlinklist DL, int DATA);  //尾插
void Delete_tail_DlinkList(Dlinklist DL);            //尾删
void Print_DlinkList(Dlinklist DL);                  //打印链表
bool Empty_DList(Dlinklist DL);                      //判空
int Length_DList(Dlinklist DL);                      //链表长度
void Destory_DList(Dlinklist DL);                    //销毁链表


Dlinklist Init_DlinkList(void)   //初始化双链表
{
	Dlinklist head = malloc(sizeof(Dnode));

	if(head != NULL)
	{
		head -> pre = NULL;
		head -> next = NULL;
		head -> data = -1;
		return head;
	}
	else
	{
		printf("初始化双链表失败!n");
	}
}

Dlinklist Creat_newNode(int DATA)   //创建一个新节点
{
	Dlinklist newNode = malloc(sizeof(Dnode));

	if(newNode != NULL)
	{
		newNode -> data = DATA;
		newNode -> pre = NULL;
		newNode -> next = NULL;
		return newNode;
	}
	else
	{
		printf("创建新新节点失败!n");
		return 0;
	}
}

void Insert_head_DlinkList(Dlinklist DL, int DATA)  //头插
{
	Dlinklist newnode = Creat_newNode(DATA);

	newnode -> pre = DL;
	newnode -> next = DL -> next;
	DL -> next = newnode;
	if(newnode -> next != NULL)   //如果仅有头节点,则头节点的next指向空,不存在pre
	{
		newnode -> next -> pre = newnode;
	}	
}

void Delete_head_DlinkList(Dlinklist DL)  //头删
{
	if(DL -> next == NULL)
	{
		printf("链表为空!n");
	}
	else
	{
		Dlinklist p;
	    p = DL -> next; //p指向首结点
	    DL -> next = p -> next;
	    p -> next -> pre = DL;

	    printf("要删除的数据为:%dn", p -> data);
	    
	    free(p);
	}
}

void Insert_tail_DlinkList(Dlinklist DL, int DATA)  //尾插
{
	Dlinklist newnode, tail; //创建一个新节点
	tail = DL;                //tail先指向头节点
	newnode = Creat_newNode(DATA);
	while( tail -> next != NULL)   //让tail指向最后一个节点
	{
		tail = tail -> next;
	}
    newnode -> pre = tail;
    tail -> next = newnode; 
    newnode -> next = NULL;	
}

void Delete_tail_DlinkList(Dlinklist DL)  //尾删
{
	Dlinklist tail = DL; //tail先指向头节点

	while(tail -> next != NULL)//让tail指向最后一个节点
	{
		tail = tail -> next;
	}
	tail -> pre -> next = NULL;
	tail -> pre = NULL;

	printf("要删除的数据为:%dn", tail -> data);

	free(tail);
}

void Print_DlinkList(Dlinklist DL)       //打印链表
{
	if(Empty_DList(DL) == 1)
	{
		printf("链表为空!n");
	}
	else
	{
		Dlinklist p = DL -> next;

		while(p != NULL)
		{
			if(p -> next != NULL)
			{
				printf("%d ---> ", p -> data);
			}
			else
			{
				printf("%dn", p -> data);
			}
			p = p -> next;
		}
	}		
}

bool Empty_DList(Dlinklist DL)          //判空
{
	if(DL -> next == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int Length_DList(Dlinklist DL)           //链表长度
{
	if(Empty_DList(DL) != 1)
	{
		int length = 0;
		Dlinklist p = DL;
		while(p -> next != NULL)
		{
			length++;
			p = p -> next;
		}
		return length;
	}
	else
	{
		return 0;
	}
}

void Destory_DList(Dlinklist DL)                    //销毁链表
{
	if(Empty_DList(DL) != 1)
	{
		Dlinklist p = DL;
		while(p -> next != NULL) //循环头删
		{
			Delete_head_DlinkList(DL);
			p = p -> next;
		}
		printf("free:%dn", p -> data);
		free(p);
		free(DL);
	}
	else
	{
		free(DL);
	}
}

int main()
{
	Dlinklist DL = Init_DlinkList();
	
	Print_DlinkList(DL);
	for(int i = 0; i < 5; i++)
	{
		Insert_head_DlinkList(DL, i);
	}
	Print_DlinkList(DL);
	printf("length:%dn", Length_DList(DL));

    Insert_tail_DlinkList(DL, 79);
    Insert_tail_DlinkList(DL, 69);
    Insert_tail_DlinkList(DL, 59);
    Print_DlinkList(DL);
	printf("length:%dn", Length_DList(DL));

	Delete_head_DlinkList(DL);
	Print_DlinkList(DL);
	printf("length:%dn", Length_DList(DL));

	Delete_tail_DlinkList(DL);
	Print_DlinkList(DL);
	printf("length:%dn", Length_DList(DL));

	Destory_DList(DL);
	Print_DlinkList(DL);
}

结果:

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

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

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