数据结构(C达到)------- 双链表

双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点。

双向链表结点的类型描写叙述:

//双向链表的类型描写叙述
typedef int ElemType;
typedef struct node{
	ElemType data;
	struct node *prior,*next;
}DuLNode,*DuLinkList;

当中。prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。

双向链表有两个特点:一是能够从两个方向搜索某个结点,这使得链表的某些操作(如插入和删除)变得比較简单; 二是不管利用前链还是后链都能够遍历整个双向链表。

双向链表的操作基本和单链表的操作同样。

1. 头插法创建带头结点的双向链表Create_DLinkListF(int n)

//头插法创建带头结点的双向链表
DuLinkList Create_DLinkListF(int n){
	DuLinkList L,p;
	int i = n - 1;
	ElemType x;
	//新建头结点
	L = (DuLinkList)malloc(sizeof(DuLNode));
	L->prior = NULL;
	L->next = NULL;

	//加入第一个结点
	scanf("%d",&x);
	p = (DuLinkList)malloc(sizeof(DuLNode));
	p->data = x;
	L->next = p;
	p->prior = L;
	p->next = NULL;

	//加入其它结点
	while(i > 0){
		scanf("%d",&x);
		p = (DuLinkList)malloc(sizeof(DuLNode));
		p->data = x;

		p->next = L->next;
		L->next->prior = p;
		p->prior = L;
		L->next = p;

		i--;
	}
	return L;
}

2. 尾插法创建带头结点的双向链表Create_DLinkListR(int n)

//尾插法创建带头结点的双向链表
DuLinkList Create_DLinkListR(int n){
	DuLinkList L,p,lastNode;
	int i = n - 1;
	ElemType x;
	//新建头结点
	L = (DuLinkList)malloc(sizeof(DuLNode));
	L->prior = NULL;
	L->next = NULL;

	//加入第一个结点
	scanf("%d",&x);
	p = (DuLinkList)malloc(sizeof(DuLNode));
	p->data = x;
	L->next = p;
	p->prior = L;
	p->next = NULL;

	lastNode = p;
	//加入其它结点
	while(i > 0){
		scanf("%d",&x);
		p = (DuLinkList)malloc(sizeof(DuLNode));
		p->data = x;

		lastNode->next = p;
		p->prior = lastNode;
		p->next = NULL;

		lastNode = p;
		i--;

	}
	return L;

}

3. 在指定结点之前插入新结点Insert_DLinkListBefore(DuLinkList p,ElemType x)

//在指定结点之前插入新结点
void Insert_DLinkListBefore(DuLinkList p,ElemType x){
	DuLinkList newNode;
	//推断结点p之前的结点的合法性:
	if(p->prior == NULL)
		printf("结点不合法。不能在该结点之前插入结点\n");
	else{
		newNode = (DuLinkList)malloc(sizeof(DuLNode));
		newNode->data = x;

		newNode->next = p;
		p->prior->next = newNode;
		newNode->prior = p->prior;
		p->prior = newNode;
	}
}

4. 在指定结点之后插入新结点Insert_DLinkListAfter(DuLinkList p,ElemType x)

//在指定结点之后插入新结点
void Insert_DLinkListAfter(DuLinkList p,ElemType x){

	DuLinkList newNode;
	newNode = (DuLinkList)malloc(sizeof(DuLNode));
	newNode->data = x;

	//当插入位置是最后一个结点之后时
	if(p->next == NULL){
		p->next = newNode;
		newNode->prior = p;
		newNode->next = NULL;
	}
	else{
		newNode->next = p->next;
		p->next->prior = newNode;
		p->next = newNode;
		newNode->prior = p;
	}
}

5. 删除指定结点Delete_DLinkList(DuLinkList p)

//删除指定结点
void Delete_DLinkList(DuLinkList p){
	//假设删除的是最后一个元素
	if(p->next == NULL)
		p->prior->next = NULL;

	else{
		p->prior->next = p->next;
		p->next->prior = p->prior;

	}
	free(p);
}

6. 后链输出双向链表Print_DLinkListN(DuLinkList L)

//后链输出双向链表
void Print_DLinkListN(DuLinkList p){

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

}

7.前链输出双向链表Print_DLinkListP(DuLinkList p)

//前链输出双向链表
void Print_DLinkListP(DuLinkList p){

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

至于双向链表的其它操作。如定位。和单链表的操作类同,不再赘述。

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-27 07:16:10

数据结构(C达到)------- 双链表的相关文章

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考

【c++版数据结构】之双链表的实现(带头结点以及尾节点)

所实现的双链表的结构如下图所示: 双链表的实现,和第一篇文章单链表的实现大致相同点击打开链接 本篇文章在构建节点的同时,初始化构建节点的前驱和后继,具体细节参考下列代码 头文件:DList.h #ifndef DLIST_H_ #define DLIST_H_ typedef enum{FALSE,TRUE}Status; #include<iostream> #include<cassert> using namespace std; template<class Type

[C++11][数据结构]自己的双链表实现

这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式,而是使用传统的[head,tail].不过,为了配合stl算法,我还是加了两个begin(),end()方法,模拟了一下stl容器.模拟的还算及格,至少我可以做类似for (; begin != end; ++begin)这样的事,也可以让我的容器搭配一些stl算法,这在之后的demo里可以看到.

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

数据结构之自建算法库——双链表

本文针对数据结构基础系列网络课程(2):线性表中第12课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:dlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef DLINKLIST_H_INCLUDED #define DLINKLIST_H_INCLUDED typedef int ElemType; typedef s

【算法和数据结构】_13_小算法_双链表

没什么新的内容,把自己写的练习代码贴出来,供大家批判. 1 /* 2 本程序用来测试非线性存储结构:双链表 3 */ 4 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 10 //**************************************************0 11 // 定义双链表数据结构 12 struct dbllink 13 { 14 char data; 15 struct dbllink* preN

C# 数据结构 - 单链表 双链表 环形链表

链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一个节点一个节点去访问,这样所花的时候就比较多了.(顺序表可以弥补这缺点,但插入和删除就非常耗性能) 单链表 单链表的构成:必须要有一个链表头(head),每个节点里面有一个Next用于指向下一个节点(类似于指针).最后一个节点的Next为null来标识链表的尾. 如下图 代码实现 1 /* ----