链表-双向链表(C语言)
基本操作
(1)头插法和尾插法进行初始化
(2)查找值为x的结点
(3)按照序号查找结点值
(4)双向链表的插入操作(在第i位插入n)
(5)删除第i个结点
(6)打印链表所有结点的值
版本1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode
{int data;struct DNode *prior, *next;
}DNode, *DLinkList;//双链表的初始化操作(这里使用头插法进行初始化)
DLinkList List_HeadInsert(DLinkList &L)
{//初始化一个链表L = (DLinkList)malloc(sizeof(DNode));L->prior = NULL;L->next = NULL;int x;scanf("%d", &x);while (x != 9999) {DNode *s = (DNode*)malloc(sizeof(DNode));s->data = x;s->next = L->next;if (L->next != NULL) {L->next->prior = s; }L->next = s;s->prior = L;scanf("%d", &x);}return L;
}//双链表的初始化操作(尾插法)
DLinkList List_TailInsert(DLinkList& L)
{L = (DLinkList)malloc(sizeof(DNode));L->prior = NULL;L->next = NULL;int x;DNode* r = L;//尾指针scanf("%d", &x);while (x != 9999) {DNode* s = (DNode*)malloc(sizeof(DNode));s->data = x;r->next = s;s->prior = r;r = s;//更新尾指针scanf("%d", &x);}r->next = NULL;return L;
}//查找值为x的结点
DNode* LocateElem(DLinkList& L,int x) {DNode* p = L->next;while (p != NULL) {if (p->data == x) {break;}p = p->next;}return p;
}//按照序号查找结点值
DNode* GetElem(DLinkList L,int i)
{int j = 1;DNode* p = L->next;if (i < 1) {return NULL;}if (i == 0) {return L;}while (p && j < i) {p = p->next;j++;}return p;
}//双链表的插入操作(在第i位插入n)
void insert_Elem(DLinkList& List, int i, int n) {DNode* tmp = GetElem(List, i - 1);DNode* newnode = (DNode*)malloc(sizeof(DNode));newnode->data = n;newnode->next = tmp->next;if (tmp->next != NULL) {tmp->next->prior = newnode;}tmp->next = newnode;newnode->prior = tmp;
}//删除第i个结点
void delete_Elem(DLinkList&List,int i)
{DNode* p = GetElem(List, i - 1);DNode* tmp = p->next;p->next = tmp->next;if (tmp->next != NULL) {tmp->next->prior = p;}delete tmp;
}//打印双链表
void display(DLinkList List)
{DNode* p = List->next;printf("链表元素的数值为:\n");while (p != NULL) {printf("%d ", p->data);p = p->next;}printf("\n");
}int main()
{DLinkList L;printf("头插法初始化链表\n");List_HeadInsert(L);display(L);DLinkList L1;printf("尾插法初始化链表\n");List_TailInsert(L1);display(L1);printf("L的第一个元素为:%d", GetElem(L, 1)->data);insert_Elem(L, 2, 100);printf("在2位置处插入100后的L中元素为:\n");display(L);delete_Elem(L, 3);printf("删除第三个元素后L中元素为:\n");display(L);return 0;
}
版本2:另一种结构体定义方式,就写了头插法的初始化和打印,原理和版本1差不多。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//分别定义结点和双向链表结构体
typedef struct DNode
{int data;DNode* prior, * next;
} DNode;typedef struct DLinkList
{DNode* head;DNode* tail;int size;
}DLinkList;DLinkList List_HeadInsert(DLinkList& L)
{L.head = (DNode*)malloc(sizeof(DNode));L.tail = (DNode*)malloc(sizeof(DNode));L.head->next = L.tail;L.tail->prior = L.head;int x;scanf("%d", &x);while (x != 9999) {DNode* s = (DNode*)malloc(sizeof(DNode));s->data = x;s->next = L.head->next;L.head->next->prior = s;L.head->next = s;s->prior = L.head;scanf("%d", &x);}return L;
}
//打印双链表
void display(DLinkList List)
{DNode* p = List.head->next;printf("链表元素的数值为:\n");while (p != List.tail) {printf("%d ", p->data);p = p->next;}printf("\n");
}int main()
{DLinkList L;printf("头插法初始化链表\n");List_HeadInsert(L);display(L);
}
链表-双向链表(C语言)相关推荐
- c语言链表动态分配内存,链表的C语言实现(含动态内存分配)
转自:http://blog.csdn.net/21aspnet/article/details/146968 链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一.为什么用动态 ...
- c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作
今天带来的是一个链表版本的<学生信息管理系统>,功能包括:添加.显示.查询.删除.保存.读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供 ...
- 单向链表的C语言实现与基本操作
本文的主要内容目录: 一.单向链表的C语言实现 二.单向链表的基本操作 一.单向链表的C语言实现 链表作为一种基本的数据结构在程序开发过程当中经常会使用到.对C语言来说链表的实现主要依靠结构体和指针, ...
- c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言
建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...
- c语言链表内存分配失败,链表的C语言实现之动态内存分配
链表的C语言实现之动态内存分配 來源:互聯網 2008-06-01 02:05:07 評論 一.为什么用动态内存分配 但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是 ...
- 一个完整的c语言的单链表代码,单链表完整C语言纯代码.docx
单链表完整C语言纯代码单链表完整C语言纯代码 带头结点的单链表 PAGE \* MERGEFORMAT 4 单链表 带头结点 #include #include /* 带头结点的单链表的操作 在该链表 ...
- c语言单链表功能,[数据结构]单链表(C语言)的各种功能
06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...
- 数据结构 (二) ----- 单向链表双向链表
相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...
- 奇数值结点链表(C语言实现)
习题11-7 奇数值结点链表(C语言实现) 分析:没有头结点的链表操作太麻烦了. ①注意第一个结点是奇数值结点的删除和其他结点的删除情况: ②注意奇数链表第一个结点的创建和后续结点的创建. #incl ...
- 循环单链表及C语言实现
本博文介绍循环单链表及其C语言的实现 目录 循环单链表 循环单链表的操作 插入 头结点插入 尾结点插入 指定位置插入 删除 头结点删除 尾结点删除 指定位置删除 遍历 查找 循环单链表的C语言实现 循 ...
最新文章
- 『原创』+『参考』基于PPC的图像对比程序——使用直方图度量
- 重要的动态路由OSPF(多区)
- vc++ List Control控件获得所有选中行的序号
- python 图表_用 Python 让你的数据图表动起来
- UnitTest in .NET 系列文章目录
- 计算机图形学Web前端笔记-定位并移动到指定坐标点(two.js理论及实现)
- SQLServer2008 查询分析器内容未保存,查找分析器内容
- opencv fast角检测
- 双流join(SparkStreaming)
- C# Socket之TCPUDP
- 远程桌面连接(连接服务器)报错Oracle修正
- 推荐几个对编程有帮助的游戏
- C++实现简单读取Obj格式文件
- Python 菜单中的分割线
- Hive常用函数大全(一)(关系/数学/逻辑/数值/日期/条件/字符串/集合统计/复杂类型)
- int数据超出范围的值变化
- 有梦想的闲鱼之团队介绍
- webUploader上传demo
- 宏碁暗影骑士擎AN515-58原厂预装Windows11恢复镜像oem系统
- Java 鸡翁一值钱五Java_Java案例5:斐波那契数列,百钱百鸡