双向链表中插入结点并输出
【问题描述】
对带头结点的双向链表,实现插入算法。
【输入形式】
第一行输入一个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;
}
运行结果如下:
双向链表中插入结点并输出相关推荐
- 删除两个双向链表中值相同的结点--带空白头结点
有两个双向链表,空白头结点为:ListA和ListB,要求删除这两个链表中关键字相同的结点, C语言实现,结点结构如下: view plain struct node ...
- 删除两个双向链表中值相同的结点--无空白头结点
有两个双向链表,头指针为:pListA和pListB,要求删除这两个链表中值相同的结点, C语言实现,结点结构如下: struct node // 双向链表结点 {int key;struct nod ...
- 双向链表的插入与删除(c++实现)
目录 前言 双向链表插入节点 实现代码 双向链表删除节点 实现代码 整个项目的完整代码 运行截图 总结 前言 本篇文章主要接着上文的双向链表的创建与遍历(c++实现) 双向链表插入节点 在双向链表中插 ...
- 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来
题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...
- 二叉树中的结点查找、插入
前面实现了通用树结构,介绍了树到二叉树的转换,这节实现二叉树中的结点查找.插入 目录 1. 二叉树的存储结构设计 2.二叉树中的结点查找操作 3.二叉树中的结点插入操作 1. 二叉树的存储结构设计 ...
- 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。
创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...
- Java双向链表快速排序_双向链表的插入,删除,以及链表的快速排序
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.#pragma once/ ...
- 单链表的基本操作-插入结点、删除结点、新建链表、查找结点位置
** C语言新手小白的学习笔记-------------目前持续更新中 ** 本人90后电气工程及其自动化大学生,大二开始接触C语言,写过前端,Python,但是都不精通,通过许多认识后明白了自身的许 ...
- 如何实现双向链表的插入、删除操作
如何实现双向链表的插入.删除操作 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N).如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的 ...
最新文章
- 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(1)
- floyd算法_最短路径的算法:Floyd算法
- Windows10家庭版的功能中没有Hyper-V的解决方法
- YTU 2917: Shape系列-3
- 在C++中侦测内嵌型别的存在(rev#2)
- Python-OpenCV学习--外接摄像头实时检测文本框
- sentinel 时间窗口_Sentinel潜龙勿用篇
- Get sdcard directory by adb
- android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
- 第一次申请去美国面签,需要注意哪些事项提高成功率?
- 三极管的导通条件总结
- 轻松调整C盘分区大小
- linux怎么查看hwaddr_Linux查看MAC地址方法
- win10自带计算器怎么设置中文
- 范蠡传(司马迁-史记)
- 使用车辆座椅上的压电传感器无创检测呼吸和心率
- 将WordPress后台的open-sans字体加载源从Google Fonts换为360 CDN
- python parser.add_argument函数及sys.argv[]
- POI - Excel 打印配置
- 微信小程序显示分页列表