双向链表 骑猪看日落 2022-06-16 13:08 228阅读 0赞 /*双向链表*/ #include<stdio.h> typedef struct dbnode { int num; char name[9]; char sex[3]; int age; int score; struct dbnode *prior; /*前指针*/ struct dbnode *next; /*后指针*/ }Node,*LinkList; /*结点类型、头指针类型*/ LinkList CreateLinkList() /*创建结点*/ { LinkList head; /*链表头指针*/ Node *New,*End; /*新指针、尾指针*/ int i,x; head=(LinkList)malloc(sizeof(Node));/*生成头结点*/ head->prior=head; /*头指针prior指向自己*/ head->next=head; /*头指针next指向自己*/ End=head; /*尾指针指向头指针*/ printf("请输入链表的长度:\n"); scanf("%d",&x); for(i=1;i<=x;i++) { printf("请输入学号、姓名、性别、年龄、成绩:\n"); New=(Node*)malloc(sizeof(Node));/*创建新结点*/ scanf("%d%s%s%d%d",&New->num,New->name,New->sex,&New->age,&New->score);/*输入结点信息*/ End->next=New; /*尾指针next指向新结点*/ New->prior=End; /*新结点prior指向尾结点*/ New->next=head; /*新结点next指向头结点*/ head->prior=New; /*头指针prior指向新结点*/ End=New; /*尾结点指向新结点*/ } return(head); } void OutLinkList(LinkList head) /*输出结点*/ { Node *p; int i=1; p=head; p=p->next; printf("--------学生信息档案表--------\n"); while(p!=head) { printf("Num %d:%d,%s,%s,%d,%d.\n",i++,p->num,p->name,p->sex,p->age,p->score); p=p->next; } } LinkList GetLinkList(LinkList head,int i) /*读表元素*/ { Node *p; p=head->next; int c=1; while((c<i)&&(p!=head)) /*当未到第i结点且未到头结点继续后移*/ { p=p->next; c++; } if(c==i) /*找到第i个结点*/ return p; else return NULL; /*查找失败*/ } void InsertLinkList(LinkList head,int i) /*插入结点*/ { Node *End,*New,*x; if(i==1) End=head; else End=GetLinkList(head,i-1); if(End==NULL) printf("找不到插入位置"); else { New=(Node *)malloc(sizeof(Node)); printf("请输入学号、姓名、性别、年龄、成绩:\n"); scanf("%d%s%s%d%d",&New->num,New->name,New->sex,&New->age,&New->score); New->prior=End; New->next=End->next; End->next->prior=New; End->next=New; } } void DeleteLinkList(LinkList head,int i) /*删除结点*/ { Node *p; if(i==1) p=head; else p=GetLinkList(head,i); /*查找第i个结点位置*/ if(p!=NULL) { p->prior->next=p->next; /*p前驱结点的后链指向p的后继结点*/ p->next->prior=p->prior; /*p后继结点的前链指向p的前驱结点*/ free(p); /*释放*p的空间*/ } else printf("找不到删除位置\n"); } main() { LinkList head; int n; head=CreateLinkList(); OutLinkList(head); printf("请输入插入的位置:\n"); scanf("%d",&n); InsertLinkList(head,n); OutLinkList(head); printf("请输入删除位置:\n"); scanf("%d",&n); DeleteLinkList(head,n); OutLinkList(head); }
相关 双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空 灰太狼/ 2022年12月21日 04:54/ 0 赞/ 210 阅读
相关 双向链表 一:双向链表 双向链表的节点包含数据域,前置指针域和后置指针域 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_ ゝ一世哀愁。/ 2022年11月05日 12:57/ 0 赞/ 212 阅读
相关 双向链表 APUE 308页 线程学习时候有一个链表 struct job{ struct job next; struct job prev; 古城微笑少年丶/ 2022年08月05日 05:20/ 0 赞/ 211 阅读
相关 双向链表 前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。 考虑一下下面这个情况:如果文本编辑 亦凉/ 2022年07月18日 05:29/ 0 赞/ 239 阅读
相关 双向链表 一、解析 在单链表中,有了next指针,要查找下一节点的时间复杂度为O(1),如果要查找的是上一节点的话,最坏的时间复杂度是O(n)了,以为每次都要从头开始查找。为了克服这个 「爱情、让人受尽委屈。」/ 2022年07月03日 13:57/ 0 赞/ 293 阅读
相关 双向链表 /双向链表/ include<stdio.h> typedef struct dbnode { int num; 骑猪看日落/ 2022年06月16日 13:08/ 0 赞/ 229 阅读
相关 双向链表和双向循环链表 双向链表和双向循环链表 和单向链表相比,多了一个前驱结点。如果他为空,那么next和prior都指向自己。而对于双循环链表,只需要最后一个元素的next指向head->n ╰+哭是因爲堅強的太久メ/ 2022年05月16日 01:29/ 0 赞/ 294 阅读
相关 双向链表 Problem Description 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内存中找到下一个位置,这是一个不会轻易断裂的链。但单链表有一个弱 忘是亡心i/ 2022年05月10日 04:34/ 0 赞/ 302 阅读
相关 双向链表 题目描述 构建一个双向链表并进行删除和插入操作,按要求输出。 输入 输入: 第一行输入元素个数M 第二行输入M个元素 第三行输入删除位置 第四行输入插入位 野性酷女/ 2022年04月04日 05:48/ 0 赞/ 282 阅读
相关 双向链表 【一】双向链表 > 单向链表,查找的只能是一个方向,而双向链表可以向前或向后查找。 > 单向链表不能自我删除,需要靠辅助节点;而双向链表可以自我删除 > 双向链表中的 小咪咪/ 2021年08月12日 00:11/ 0 赞/ 460 阅读
还没有评论,来说两句吧...