作业二 双向链表
来源:互联网 发布:淘宝客服怎么设置多个 编辑:程序博客网 时间:2024/06/06 08:39
首先我们来看双向链表的定义 :
typedef int ElemType;typedef struct Node * PtrToNode;typedef PtrToNode Position;struct DListNode;typedef DListNode * DList;typedef struct Node{ElemType data; /*数据域*/PtrToNode previous; /*指向前驱*/PtrToNode next;/*指向后继*/}Node;struct DListNode{PtrToNode head;/*指向头节点*/PtrToNode tail;/*指向尾节点*/int size; //链表中数据项数}
示意图大概是这样的
DListNode是什么呢?相当于一个指路牌,让你可以直接走向头结点或尾节点。
双向链表要注意的是,如果只有一个节点 A,那么A既是头结点,也是尾节点。
所以我们在写插入删除操作的时候要进行分类讨论。
2264,插入 I
void InsertAtHead(DList L, ElemType x){Position p = (PtrToNode)malloc(sizeof(Node));p->data = x;if (L->head == NULL){L->head = p;L->tail = p;p->next = NULL;p->previous = NULL;}else {p->next = L->head;L->head->previous = p;L->head = p;p->previous = NULL;}L->size++;}
//链表链接的时候基本准则都是 先连接再断开 ,虽然两个指针操作有点麻烦,但是还是比较好理解的
2265 插入2
void InsertAtTail(DList L, ElemType x){Position p = (PtrToNode)malloc(sizeof(Node));p->data = x;if (L->tail == NULL){L->head = p;L->tail = p;p->next = NULL;p->previous = NULL;}else{p->previous = L->tail;L->tail->next = p;L->tail = p;p->next = NULL;}L->size++;}
2271,删除 I
void DelFirst(DList L, ElemType *e){Position p = L->head;if (L->size == 0) return;if (L->tail == p){L->head = NULL;L->tail = NULL;}else {L->head = p->next;p->next->previous = NULL;p->next = NULL;}*e = p->data;free(p);L->size--;}
2272 删除 II
void DelLast(DList L, ElemType *e){Position p = L->tail;if (L->size == 0) return;if (L->head == p){L->head = NULL;L->tail = NULL;}else {L->tail = p->previous;p->previous->next = NULL;p->previous = NULL;}*e = p->data;free(p);L->size--;}
链表清空(非销毁的时候)要把每项数字清零,并改正size的值(head、tail指向空别忘了)
2275 双向链表的清空
void ClearList(DList L){Position p = L->head;while (p != L->tail){p->data = 0;p = p->next;}L->size = 0;L->head = NULL;L->tail = NULL;}
其他的插入删除思路可以参考上面,剩下的比较简单就不说了
阅读全文
0 0
- 作业二 双向链表
- 【课外作业】二维双向链表练习代码
- 实验二——双向链表
- 作业二之合并链表
- C# 数组集合<二> 双向链表和双向循环链表
- C++数据结构路程:第二章二阶段,双向链表
- 详解Linux内核之双向循环链表(二)
- Linux双向链表(二)——逻辑判断
- 双向循环链表设计分析之二
- 面试系列之二:C艹翻转双向链表
- 双向链表——单链表改进之二
- 数据结构与算法之双向链表 <二>
- 数据结构与算法python版(二)--双向链表
- 作业二 顺序表问题
- SzNOI 双向约瑟夫(双向链表)
- 【数据结构课程作业】双向栈
- 作业二
- 作业二
- Android 杀不死的进程
- equals()方法的重写
- Doctype作用?严格模式与混杂模式如何区分?它们有何意义?
- 【C++程序设计】-继承和派生
- windows 环境下c++ socket编程
- 作业二 双向链表
- BZOJ 3732 Network Kruskal+倍增
- 单链表中的冒泡排序(有头节点)
- 【C++程序设计】-类模板与向量
- Linux安装软件时出现无法修正错误的解决方法
- bzoj2427 软件安装
- java线程之间的调度使用wait/notify,await/single,LinkBlockingQuene实现
- 实验三十进制转二进制
- linux学习第一篇:网络配置