基本操作

(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语言)相关推荐

  1. c语言链表动态分配内存,链表的C语言实现(含动态内存分配)

    转自:http://blog.csdn.net/21aspnet/article/details/146968 链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一.为什么用动态 ...

  2. c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作

    今天带来的是一个链表版本的<学生信息管理系统>,功能包括:添加.显示.查询.删除.保存.读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供 ...

  3. 单向链表的C语言实现与基本操作

    本文的主要内容目录: 一.单向链表的C语言实现 二.单向链表的基本操作 一.单向链表的C语言实现 链表作为一种基本的数据结构在程序开发过程当中经常会使用到.对C语言来说链表的实现主要依靠结构体和指针, ...

  4. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  5. c语言链表内存分配失败,链表的C语言实现之动态内存分配

    链表的C语言实现之动态内存分配 來源:互聯網  2008-06-01 02:05:07  評論 一.为什么用动态内存分配 但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是 ...

  6. 一个完整的c语言的单链表代码,单链表完整C语言纯代码.docx

    单链表完整C语言纯代码单链表完整C语言纯代码 带头结点的单链表 PAGE \* MERGEFORMAT 4 单链表 带头结点 #include #include /* 带头结点的单链表的操作 在该链表 ...

  7. c语言单链表功能,[数据结构]单链表(C语言)的各种功能

    06-03阅读200,000 + 链表是一种常见的基本数据结构,在此充分利用了结构指针. 链表可以动态存储和分配,即链表是一个功能非常强大的数组. 他可以在节点中定义多种数据类型,并可以根据需要随意添 ...

  8. 数据结构 (二) ----- 单向链表双向链表

    相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...

  9. 奇数值结点链表(C语言实现)

    习题11-7 奇数值结点链表(C语言实现) 分析:没有头结点的链表操作太麻烦了. ①注意第一个结点是奇数值结点的删除和其他结点的删除情况: ②注意奇数链表第一个结点的创建和后续结点的创建. #incl ...

  10. 循环单链表及C语言实现

    本博文介绍循环单链表及其C语言的实现 目录 循环单链表 循环单链表的操作 插入 头结点插入 尾结点插入 指定位置插入 删除 头结点删除 尾结点删除 指定位置删除 遍历 查找 循环单链表的C语言实现 循 ...

最新文章

  1. 『原创』+『参考』基于PPC的图像对比程序——使用直方图度量
  2. 重要的动态路由OSPF(多区)
  3. vc++ List Control控件获得所有选中行的序号
  4. python 图表_用 Python 让你的数据图表动起来
  5. UnitTest in .NET 系列文章目录
  6. 计算机图形学Web前端笔记-定位并移动到指定坐标点(two.js理论及实现)
  7. SQLServer2008 查询分析器内容未保存,查找分析器内容
  8. opencv fast角检测
  9. 双流join(SparkStreaming)
  10. C# Socket之TCPUDP
  11. 远程桌面连接(连接服务器)报错Oracle修正
  12. 推荐几个对编程有帮助的游戏
  13. C++实现简单读取Obj格式文件
  14. Python 菜单中的分割线
  15. Hive常用函数大全(一)(关系/数学/逻辑/数值/日期/条件/字符串/集合统计/复杂类型)
  16. int数据超出范围的值变化
  17. 有梦想的闲鱼之团队介绍
  18. webUploader上传demo
  19. 宏碁暗影骑士擎AN515-58原厂预装Windows11恢复镜像oem系统
  20. Java 鸡翁一值钱五Java_Java案例5:斐波那契数列,百钱百鸡

热门文章

  1. 离开华为换种生活,它不香吗?
  2. 全球AI专家分布:人工智能,你真的了解吗?
  3. 秒杀限制人群,如何设计秒杀服务的限流策略?
  4. ogg mysql表结构不一致_求助:OGG双向同步,数据不一致如何解决?(已解决)
  5. jupyter 安装插件rise,变为幻灯片PPT格式
  6. PTA - 二分查找法
  7. 使用cv2.VideoCapture()函数捕获笔记本内置摄像头的拍摄画面
  8. steamship 使用gpt-4
  9. vs code下载慢的解决方法
  10. Python实用脚本/算法集合, 附源代码下载