双向链表
来源:互联网 发布:哪里算八字准 知乎 编辑:程序博客网 时间:2024/05/29 16:40
我主要说一下双向链表的创建,顺便说了一下删除尾节点的实现
[00:51:51] gcc doubledirectlink.c [00:51:55] ./a.out1->2->3->4->5now del last1->2->3->4deled[00:51:57] cat doubledirectlink.c #include<stdio.h>#include<malloc.h>typedef struct list { int data;//记录数据 struct list *pre;//指向前一个节点 struct list *next;//指向后一个节点}*link;//下面我们就可以用link直接来使用这个结构体link front=NULL,rear,ptr=NULL,head=NULL;//front是用来暂存返回的头节点的,因为我程序是这么写的,我是直接打印两次链表了。ptr是用来记录返回的头节点的,head是指链表里的表头,rear是表尾link push(int item)//插入一个元素{ link newnode=(link)malloc(sizeof(link));//开空间 newnode->data=item;//放入数据item if(head==NULL)//如果该链表为空,让其头尾节点都是这个新节点 { head=newnode; newnode->next=NULL; newnode->pre=NULL;//注意头节点的前一个以及尾节点的下一个都必须指向空,否则无法判断出链表是否结束 rear=newnode; } else { rear->next=newnode;//在尾节点插入该节点 newnode->next=NULL; newnode->pre=rear;//该节点指向前一个节点rear,因为上面的rear->next=newnode,所以这样就成为双向的了 rear=newnode; //多了这个节点后,我们把这个节点记录为最后一个节点 } return head;//需要返回头节点,否则打印的时候找不到头节点}void del(){rear=rear->pre;//让倒数第二个节点代替最后一个节点rear->next=NULL;//注意最后的节点的下一个节点还需要指向空}int main(){ int i,n,a[5]={1,2,3,4,5}; for(i=0;i<5;i++) { if(i==0) ptr=push(a[i]);//随便录入一个数后就记录它的头节点用于方便打印 else push(a[i]); } front=ptr;//因为我在删除最后一个节点后还需要打印链表,如果我不记录头阶段,下面的while循环ptr=ptr->next会破坏掉已经记录好的头节点 while(ptr) { printf("%d->",ptr->data); ptr=ptr->next; } printf("\b\bnow del last\n");//使用两个\b是因为我需要删除后面多余的->符号 del();//删除最后一个节点 ptr=front;//让ptr重新赋值为头节点 while(ptr) { printf("%d->",ptr->data); ptr=ptr->next; } printf("\b\bdeled\n"); return 0;}[00:52:04]
阅读全文
0 0
- SzNOI 双向约瑟夫(双向链表)
- 双向链表&&堆栈
- 双向链表
- 使用双向链表
- 双向链表
- 双向循环链表
- 双向循环链表
- 双向链表
- 实现双向链表
- 双向循环链表
- 建立双向链表
- 双向链表
- 双向链表
- 双向循环链表
- 双向链表
- 链表-双向链表
- 双向链表
- 双向动态链表
- 分割字符串
- oracle提示TNS:无监听程序的解决办法
- 线段数总结
- 简单测试--C#实现中文汉字转拼音首字母
- elasticsearch添加mapping
- 双向链表
- 分词学习(3),基于ngram语言模型的n元分词
- 1160-蛇形矩阵
- 笔记本风扇控制程序,支持蓝天模具笔记本
- 音乐
- 526. Beautiful Arrangement
- KMP-看毛片算法 c++
- Js屏蔽按住键盘不停输入内容的问题,实现按住也只能输入一个字符
- C++笔记