基本操作

(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. python3.7入门教程-python 3.7极速入门教程6文件处理
  2. python聚类分析如何确定分类个数_Python数据挖掘—聚类—KMeans划分法
  3. Java代码实现负载均衡六种算法(强烈建议收藏)
  4. hdu3367 Pseudoforest
  5. 微信小程序基础架构浅析
  6. Asterisk权威指南/第六章 拨号计划基础
  7. 聚宝盆,只要你上网就可以挣钱
  8. xenserver 安装新硬盘_给Xenserver添加新硬盘
  9. Angular Style
  10. 树莓派4B安装windows xp windows 95( windows xp windows 95 for raspberry pi 4B)
  11. C2000浮点运算注意事项——CPU和CLA的差异及误差处理技巧
  12. 360篡改html文件打开方式,Chrome浏览器被360导航篡改怎么办
  13. 继承中各代码块的执行顺序
  14. 如何开通电子邮箱的SMTP功能
  15. 失眠的岁月,我们都交了哪些科技智商税?
  16. 项目一:家庭记账软件
  17. 如何在VM16上安装虚拟机(win7)及联网
  18. 算法设计与分析基础知识点
  19. excel表格行列显示十字定位_突出显示活动单元格所在行列的设置方法
  20. 最新多屏群控技术---手机控制手机/苹果群控/IOS群控/实时同步操作群控功能讲解以及入门教程

热门文章

  1. 手机怎么修改编辑PDF中的文字?两分钟教你学会编辑方法
  2. 离职,见人品,显格局
  3. 笔记本实现Win10+Ubuntu双系统(超详细)
  4. c盘满了但是d盘有空间如何扩容-windows
  5. MySQL之InnoDB主键索引的B+树的高度计算
  6. 抠图:基于单个原色通道
  7. 怎么利用粉丝圈这个微信社区工具做好社群营销?我们是做教育行业
  8. 用智能手机让台式机连接无线
  9. 【数学模拟卷总结】2023李林六套卷数学二第三套
  10. 有哪些可以快速回复信息的软件