【问题描述】

对带头结点的双向链表,实现插入算法。

【输入形式】

第一行输入一个N(N大于等于1,小于1000);

第二行输入N个整数,以空格作为分隔,创建长度为N的双向链表,为双向输出方便,需保留头尾指针;

第三行输入pos和e,以空格分隔,分别表示插入位置和插入元素的值。
【输出形式】

若插入位置合法,插入成功,则输出:

第一行从头开始顺向输出双向链表中元素,用空格分隔;

第二行从尾结点开始逆向输出双向链表中元素,用空格分隔。

若插入位置不合法,例如插入位置<1或超出链表范围,则输出error

【样例输入1】

5

-4  5  2  7  0

2  100

【样例输出1】

-4 100 5 2 7 0

0 7 2 5 100 -4

【样例输入2】

5

1 2 3 4 5

6 6

【样例输出2】

1 2 3 4 5 6

6 5 4 3 2 1

【样例输入3】

5

1 2 3 4 5

8 8

【样例输出3】

error

要完成这个问题,首先我们需要知道双向链表如何表示。

双向链表的实现:

如果在线性链表的结点中增加一个指针域,用来指向结点的直接前驱,则从表中的任一结点出发,既可以向后查找结点的后继,也可以向前查找结点的前驱。整个链表包含分别指向前驱和后继的两条链,称为双向链表。双向链表的存储结构如图所示:

双向链表的存储表示描述如下:

typedef struct DuLNode
{ElemType data;struct DuLNode * prior;struct DuLNode * next;
}DuLNde,* DuLinkList;

初始化如下:

DuLinkList initList()
{DuLNode* head;DuLNode* rear;head=(struct DuLNode*)malloc(sizeof(struct DuLNode));if(!head)return NULL;rear=(struct DuLNode*)malloc(sizeof(struct DuLNode));if(!rear)return NULL;head->prior=NULL;head->next=rear;rear->prior=head;rear->next=NULL;return head;
}

双向链表的插入和删除操作都必须同时进行两个反向上的指针修改,操作过程比线性表复杂。插入和删除操作如下图所示:

插入代码表示:

int insertList(DuLinkList head,int pos, ElemType e)
{if(pos<1){printf("error\n");return 0;}DuLNode* p=head;int i;for(i=1;i<pos;i++){if(p->next==NULL){printf("error\n");return 0;}p=p->next;}DuLNode* pnew;pnew=(DuLinkList)malloc(sizeof(DuLNode));pnew->data=e;p->next->prior=pnew;pnew->next=p->next;p->next=pnew;pnew->prior=p;return 1;
}

最后完整代码的实现及检查:

#include<stdio.h>
#include<stdlib.h>
typedef  int ElemType;
typedef struct DuLNode
{ElemType data;struct DuLNode *prior;struct DuLNode *next;
}DuLNode,*DuLinkList;
//初始化
DuLinkList initList()
{DuLNode* head;DuLNode* rear;head=(struct DuLNode*)malloc(sizeof(struct DuLNode));if(!head)return NULL;rear=(struct DuLNode*)malloc(sizeof(struct DuLNode));if(!rear)return NULL;head->prior=NULL;head->next=rear;rear->prior=head;rear->next=NULL;return head;
}
//插入
int insertList(DuLinkList head,int pos, ElemType e)
{if(pos<1){printf("error\n");return 0;}DuLNode* p=head;int i;for(i=1;i<pos;i++){if(p->next==NULL){printf("error\n");return 0;}p=p->next;}DuLNode* pnew;pnew=(DuLinkList)malloc(sizeof(DuLNode));pnew->data=e;p->next->prior=pnew;pnew->next=p->next;p->next=pnew;pnew->prior=p;return 1;
}
void createList(DuLinkList head,int n)
{ElemType e;int i;for(i=1;i<=n;i++){scanf("%d",&e);insertList(head,i,e);}return;
}
void printList(DuLinkList head,DuLinkList rear)
{DuLNode* p=head;while(p->next!=rear){p=p->next;printf("%d ",p->data);}return;}
void reprintList(DuLinkList head,DuLinkList rear)
{DuLNode* p=rear;while(p->prior!=head){p=p->prior;printf("%d ",p->data);}return;
}
int main()
{DuLinkList head,rear;ElemType e;int n,pos;scanf("%d",&n);head=initList();rear=head->next;createList(head,n);scanf("%d %d",&pos,&e);if(insertList(head,pos,e)){printList(head,rear);printf("\n");reprintList(head,rear);}return 0;
}

运行结果如下:

双向链表中插入结点并输出相关推荐

  1. 删除两个双向链表中值相同的结点--带空白头结点

    有两个双向链表,空白头结点为:ListA和ListB,要求删除这两个链表中关键字相同的结点, C语言实现,结点结构如下: view plain struct node                  ...

  2. 删除两个双向链表中值相同的结点--无空白头结点

    有两个双向链表,头指针为:pListA和pListB,要求删除这两个链表中值相同的结点, C语言实现,结点结构如下: struct node // 双向链表结点 {int key;struct nod ...

  3. 双向链表的插入与删除(c++实现)

    目录 前言 双向链表插入节点 实现代码 双向链表删除节点 实现代码 整个项目的完整代码 运行截图 总结 前言 本篇文章主要接着上文的双向链表的创建与遍历(c++实现) 双向链表插入节点 在双向链表中插 ...

  4. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

  5. 二叉树中的结点查找、插入

    前面实现了通用树结构,介绍了树到二叉树的转换,这节实现二叉树中的结点查找.插入 目录 1. 二叉树的存储结构设计 2.二叉树中的结点查找操作 3.二叉树中的结点插入操作 1. 二叉树的存储结构设计   ...

  6. 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。

    创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...

  7. Java双向链表快速排序_双向链表的插入,删除,以及链表的快速排序

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.#pragma once/ ...

  8. 单链表的基本操作-插入结点、删除结点、新建链表、查找结点位置

    ** C语言新手小白的学习笔记-------------目前持续更新中 ** 本人90后电气工程及其自动化大学生,大二开始接触C语言,写过前端,Python,但是都不精通,通过许多认识后明白了自身的许 ...

  9. 如何实现双向链表的插入、删除操作

    如何实现双向链表的插入.删除操作 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N).如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(1)
  2. floyd算法_最短路径的算法:Floyd算法
  3. Windows10家庭版的功能中没有Hyper-V的解决方法
  4. YTU 2917: Shape系列-3
  5. 在C++中侦测内嵌型别的存在(rev#2)
  6. Python-OpenCV学习--外接摄像头实时检测文本框
  7. sentinel 时间窗口_Sentinel潜龙勿用篇
  8. Get sdcard directory by adb
  9. android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
  10. 第一次申请去美国面签,需要注意哪些事项提高成功率?
  11. 三极管的导通条件总结
  12. 轻松调整C盘分区大小
  13. linux怎么查看hwaddr_Linux查看MAC地址方法
  14. win10自带计算器怎么设置中文
  15. 范蠡传(司马迁-史记)
  16. 使用车辆座椅上的压电传感器无创检测呼吸和心率
  17. 将WordPress后台的open-sans字体加载源从Google Fonts换为360 CDN
  18. python parser.add_argument函数及sys.argv[]
  19. POI - Excel 打印配置
  20. 微信小程序显示分页列表

热门文章

  1. JS中的location.href
  2. position:搜索框显示历史浏览记录
  3. 微信小程序快速开发上手
  4. springboot入门介绍
  5. JavaScript 'Pig latin is cool'=='igPay atinlay siay oolcay'
  6. uni-app 图片适配 动态计算图片高度
  7. Flutter RotatedBox 旋转组件
  8. react特性-声明式编程
  9. 华为lab-rs-v1-2.9_OSPF区域34
  10. WEB前端响应式布局之BootStarp使用