双向链表 野性酷女 2022-04-04 05:48 257阅读 0赞 ### ### 题目描述 构建一个双向链表并进行删除和插入操作,按要求输出。 输入 输入: 第一行输入元素个数M 第二行输入M个元素 第三行输入删除位置 第四行输入插入位置和插入元素 第五行输入输出时的起始位置 输出 按要求的起始位置输出链表 样例输入 8 1 2 3 4 5 6 7 8 6 6 6 5 样例输出 5 6 7 8 1 2 3 4 ##### 分析: ##### 此题考察链表的多方面知识。我在此题卡了一个早上,真吓人。 分析一下我卡的原因,一是为考虑根本不需要删除的时候怎么办(即第三行直接换行 )。然后插入的时候出入的的位置是最后一个数的后面怎么办。 #include"stdio.h" #include"string.h" typedef struct a{ long long data; long long subscript; struct a *pre; struct a *next; }*LinkList,Node; //创建一个链表 void CreateListTail(LinkList *L,long long n) { LinkList p,r; long long i; (*L)=(LinkList)malloc(sizeof(Node)); r=(*L); for(i=1;i<=n;i++) { p=(LinkList)malloc(sizeof(Node)); scanf("%lld",&(p->data)); p->subscript=i; p->pre=r; r->next=p; r=p; } r->next=(*L)->next; (*L)=(*L)->next; (*L)->pre=r; } //删除指点结点 void Delete(LinkList *L,long long DeleteLocation) { LinkList pre,T; pre=*L;T=*L; if(DeleteLocation==1) { T->pre->next=T->next; *L=pre->next; T->next->pre=T->pre; } else {/*while(T->subscript!=DeleteLocation) { pre=T; T=T->next; }*/ DeleteLocation--; while(DeleteLocation--) { pre=T; T=T->next; } T->next->pre=pre; pre->next=T->next; } } //在指定位置插入一个指定的值 void Insert(LinkList *L,long long InsertionPosition,long long digit) { LinkList pre,T,P; P=(LinkList)malloc(sizeof(Node)); P->data=digit; P->subscript=InsertionPosition; P->next=NULL; P->pre=NULL; T=*L; pre=*L; if(InsertionPosition==1) { T->pre->next=P; P->pre=T->pre; P->next=T; T->pre=P; *L=P; } else {while(T->subscript<InsertionPosition&&pre->subscript<=T->subscript) { pre=T; T=T->next; } if(pre->subscript>T->subscript) { P->next=T; T->pre=P; pre->next=P; P->pre=pre; } else {pre->next=P; P->pre=pre; P->next=T; T->pre=P; } } } //刷新该结点的链表的位置值 void Plash(LinkList *L) { LinkList T; long long count=1; T=*L; T->subscript=count; T=T->next; while(T!=*L) { T->subscript=++count; T=T->next; } } //从指定的位置输出 void PUSH(LinkList *L,long long Mark,long long number) { LinkList T,P; T=*L; P=T; /* while(T->subscript<Mark) { T=T->next; }*/ Mark--; while(Mark--) { T=T->next; } P=T->pre; while(T!=P) { printf("%lld ",T->data); T=T->next; } printf("%d \n",T->data); } int main() { LinkList L,P; long long m,i,InsertionPosition,DeleteLocation,digit,Mark,q; char DeleteLocation1,c; while(~scanf("%lld",&m)) { q=0; CreateListTail(&L,m); scanf("%c",&c); scanf("%c",&DeleteLocation1); DeleteLocation=DeleteLocation1-'0'; if(DeleteLocation>=1&&DeleteLocation<=m) {Delete(&L,DeleteLocation);q=1;} Plash(&L); scanf("%lld%lld",&InsertionPosition,&digit); Insert(&L,InsertionPosition,digit); Plash(&L); scanf("%lld",&Mark); PUSH(&L,Mark,m+q); } }
相关 双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空 灰太狼/ 2022年12月21日 04:54/ 0 赞/ 192 阅读
相关 双向链表 一:双向链表 双向链表的节点包含数据域,前置指针域和后置指针域 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_ ゝ一世哀愁。/ 2022年11月05日 12:57/ 0 赞/ 193 阅读
相关 双向链表 APUE 308页 线程学习时候有一个链表 struct job{ struct job next; struct job prev; 古城微笑少年丶/ 2022年08月05日 05:20/ 0 赞/ 190 阅读
相关 双向链表 前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。 考虑一下下面这个情况:如果文本编辑 亦凉/ 2022年07月18日 05:29/ 0 赞/ 212 阅读
相关 双向链表 一、解析 在单链表中,有了next指针,要查找下一节点的时间复杂度为O(1),如果要查找的是上一节点的话,最坏的时间复杂度是O(n)了,以为每次都要从头开始查找。为了克服这个 「爱情、让人受尽委屈。」/ 2022年07月03日 13:57/ 0 赞/ 270 阅读
相关 双向链表 /双向链表/ include<stdio.h> typedef struct dbnode { int num; 骑猪看日落/ 2022年06月16日 13:08/ 0 赞/ 206 阅读
相关 双向链表和双向循环链表 双向链表和双向循环链表 和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->n ╰+哭是因爲堅強的太久メ/ 2022年05月16日 01:29/ 0 赞/ 273 阅读
相关 双向链表 Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱 忘是亡心i/ 2022年05月10日 04:34/ 0 赞/ 281 阅读
相关 双向链表 题目描述 构建一个双向链表并进行删除和插入操作,按要求输出。 输入 输入: 第一行输入元素个数M 第二行输入M个元素 第三行输入删除位置 第四行输入插入位 野性酷女/ 2022年04月04日 05:48/ 0 赞/ 257 阅读
相关 双向链表 【一】双向链表 > 单向链表,查找的只能是一个方向,而双向链表可以向前或向后查找。 > 单向链表不能自我删除,需要靠辅助节点;而双向链表可以自我删除 > 双向链表中的 小咪咪/ 2021年08月12日 00:11/ 0 赞/ 430 阅读
还没有评论,来说两句吧...