数据结构与算法--双向链表及线性表应用

本文详细介绍了双向链表的结构及其插入、删除操作,并对比了单链表、循环链表和双向链表的时间效率。同时,讨论了顺序表与链表的优缺点。重点探讨了线性表的应用,包括线性表的合并,提供了顺序表和链表实现的算法步骤。
摘要由CSDN通过智能技术生成

一、双向链表

         1) 双向链表: 在单链表的每个结点里在增加一个指向其直接前驱的指针域

         2) 双向循环链表: 让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点

         3) 双向链表结构的对称性(设指针p指向某一结点):

                     p->front->next = p = p->next->front;

         4) 双向链表的结点类型定义:

typedef int Datatype;

typedef struct Node
{
	Datatype data;
	struct Node *front, *next;           //前驱指针域和后继指针域
}Node,pNode; 

         5) 双向链表的插入:

void InsertList(pNode *p, int i, Datatype x)                    //双向链表的插入
{
	int length = 0;                                        ///计算表长
	pNode pL = (*p);
	pNode qL = (*p);                                       //定位到第i个结点
	int j = 0;
	pNode pnode;
	pnode = (pNode)malloc(sizeof(Node));
	pnode->data = x;                                            //生成数据域为x的新结点
	if ((*p)->next == NULL)                                    //判断链表是否为空
	{
		printf("链表为空!\n");
		return;
	}
	while (pL->next != NULL)
	{
		length++;                                               //依次迭代计数
		pL = pL->next;             
	}
	if (i<1 || i>length)                                       //判断输入位置是否合理
	{
		printf("输入位置不合理!\n");
		return;
	}
	while (j < i)
	{
		qL = qL->next;
		j++;
	}             
	pnode->front = qL->front;
	qL->front->next = pnode;
	pnode->next = qL;
	qL->front = pnode;
}

         6) 双向链表的删除:

void DeleteList(pNode *p, int i)                                   //双向链表的删除
{
	int length = 0;                                       //计算表长
	pNode pL = (*p);
	pNode qL = (*p);                                      //定位到第i个结点
	int j = 0;
	if ((*p)->next == NULL)                               //判断链表是否为空
	{
		printf("链表为空!\n");
		return;
	}
	while (pL->next != NULL)
	{
		length++;                                         //依次迭代计数
		pL = pL->next;
	}
	if (i<1 || i>length)                                 //判断输入位置是否合理
	{
		printf("输入位置不合理!\n");
		return;
	}
	while (j < i)
	{
		qL = qL->next;
		j++;
	}
	qL->front->next = qL->next;
	qL->next->front = qL->front;
	free(qL);
}

二、单链表、循环链表和双向链表的时间效率比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值