作业二 双向链表
2017-10-21 14:22
148 查看
首先我们来看双向链表的定义 :
示意图大概是这样的
DListNode是什么呢?相当于一个指路牌,让你可以直接走向头结点或尾节点。
双向链表要注意的是,如果只有一个节点 A,那么A既是头结点,也是尾节点。
所以我们在写插入删除操作的时候要进行分类讨论。
2264,插入 I
//链表链接的时候基本准则都是 先连接再断开 ,虽然两个指针操作有点麻烦,但是还是比较好理解的
2265 插入2void 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
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;
}
其他的插入删除思路可以参考上面,剩下的比较简单就不说了
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 插入2void 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;
}
其他的插入删除思路可以参考上面,剩下的比较简单就不说了
相关文章推荐
- 九度 题目1503:二叉搜索树与双向链表
- C语言强化(一)二叉排序树转成排序的双向链表
- UVa 12657 Boxes in a Line 数组模拟双向循环链表
- 双向链表的学习
- Java语言中链表和双向链表
- 利用双向循环链表进行显示更新
- 双向链表的构建
- Linux内核2.6.14源码分析-双向循环链表代码分析
- 用双向链表对整形数据进行排序
- 数据结构:XOR链表--- 一个空间高效的双向链表
- 研磨数据结构与算法-05双端链表与双向链表
- 双向链表的插入算法
- Java数据结构与算法分析《五》双端链表和双向链表
- 线性表之双向链表
- Linux实现插入排序的双向链表
- 双向链表
- 双向循环链表的实现
- [剑指Offer] 26.二叉搜索树与双向链表
- 把二元查找树变成双向链表
- 双向链表的建立插入删除