算法导论 第10章 10.2 链表
来源:互联网 发布:strong to json 编辑:程序博客网 时间:2024/06/06 04:19
一、概念
(1)数组的线性序是由数组的下标决定的,链表中的顺序是由各对象中的指针所决定的
(2)链表结点结构
node *prev;
node *next;
int key;
(3)链表结点
node *head;
node *nil;//哨兵
(4)对链表的操作
LIST-SEARCH(L, k)
LIST-INSERT(L, x)
LIST-DELETE(L, x)
(5)哨兵是个哑对象,可以简化边界条件
二、代码
(1)没有哨兵的情况
//链表结点结构struct node{node *pre;node *next;int key;//构造函数node(int x):pre(NULL),next(NULL),key(x){}};//链表结构struct List{node *head;List():head(NULL){}};//打印void List_Print(List *L){node *p = L->head;while(p){cout<<p->key<<' ';p = p->next;}cout<<endl;}//搜索,找出L中第一个关键字为k的结点,没有则返回NULLnode *List_Search(List *L, int k){node *x = L->head;while(x != NULL && x->key!=k)x = x->next;return x;}//插入void List_Insert(List *L, node *x){//插入到表的前端x->next = L->head;if(L->head != NULL)L->head->pre = x;L->head = x;x->pre = NULL;}//删除void List_Delete(List *L, node* x){if(x->pre != NULL)x->pre->next = x->next;elseL->head = x->next;if(x->next != NULL)x->next->pre = x->pre;delete x;}
(2)有哨兵的情况
//链表结点结构struct node{node *pre;node *next;int key;//构造函数node(int x):pre(NULL),next(NULL),key(x){}};//链表结构struct List{node *nil;//哨兵List(){nil = new node(0);nil->next = nil;nil->pre = nil;}};//打印void List_Print(List *L){node *p = L->nil->next;while(p != L->nil){cout<<p->key<<' ';p = p->next;}cout<<endl;}//搜索,找出L中第一个关键字为k的结点,没有则返回NULLnode *List_Search(List *L, int k){node *x = L->nil->next;while(x != L->nil && x->key!=k)x = x->next;return x;}//插入void List_Insert(List *L, node *x){//插入到表的前端x->next = L->nil->next;L->nil->next->pre = x;L->nil->next = x;x->pre = L->nil;}//删除void List_Delete(List *L, node* x){x->pre->next = x->next;x->next->pre = x->pre;delete x;}
三、练习
10.2-1能,能10.2-2//结点struct node{node *pre;//为了方便实现出栈操作node *next;int key;node(int x):pre(NULL),next(NULL),key(x){}};//链式栈struct list{node *Head;//栈的起始结点node *Top;//栈顶指针list(){Head = new node(0);Top = Head;}};//打印栈中的元素void Print(list *L){node *p = L->Head->next;while(p){cout<<p->key<<' ';p = p->next;}cout<<endl;}//入栈void Push(list *L, int x){//构造一个新的结点node *A = new node(x);//链入到栈顶位置,修改指针L->Top->next = A;A->pre = L->Top;L->Top = A;}//出栈int Pop(list *L){if(L->Head == L->Top){cout<<"error:underflow"<<endl;return -1;}//取出栈顶元素int ret = L->Top->key;//修改指针node *A = L->Top;L->Top = A->pre;L->Top->next = NULL;delete A;return ret;}10.2-3//结点struct node{node *next;int key;node(int x):next(NULL),key(x){}};//链式队列struct list{node *Head;//头指针node *Tail;//尾指针list(){Head = new node(0);Tail = Head;}};//打印void Print(list *L){node *p = L->Head->next;while(p){cout<<p->key<<' ';p = p->next;}cout<<endl;}//入队列void Enqueue(list *L, int x){//构造一个新的结点node *A = new node(x);//链入尾部,修改指针L->Tail->next = A;L->Tail = A;}//出队列int Dequeue(list *L){if(L->Head == L->Tail){cout<<"error:underflow"<<endl;return -1;}//取出队头结点,修改指针node *A = L->Head->next;int ret = A->key;L->Head->next = A->next;if(A == L->Tail)L->Tail = L->Head;delete A;return ret;}10.2-4把哨兵的值置为一个不可能与x相等的值
10.2-5
见算法导论 10.2-5 环形链表实现字典操作INSERT、DELETE、SEARCH
10.2-6
使用带尾指针的链表,令A的尾指针为tail,tail->next=B
10.2-7
//逆转void Reverse(list *L){node *p = NULL, *q = L->Head, *r;//依次修改指针,让q是p->next,令q->next=pwhile(1){r = q->next;q->next = p;if(r == NULL){L->Head = q;break;}p = q;q = r;}}
10.2-8
见算法导论-10.2-8
- 算法导论 第10章 10.2 链表
- 算法导论-第10章-10.2 链表
- 《算法导论》笔记 第10章 10.2 链表
- 算法导论-第10章
- 《算法导论》第10章 基本数据结构 (2)链表
- 算法导论 第10章 思考题
- 算法导论 第10章 基本数据结构
- 算法导论第10章 基本数据结构
- 算法导论第3章
- 算法导论-第1章
- 算法导论-第2章
- 算法导论-第3章
- 算法导论-第4章
- 算法导论-第5章
- 算法导论-第6章
- 算法导论-第7章
- 算法导论-第8章
- 算法导论-第9章
- Sutherland-Hodgman算法(多边形裁剪)
- 分享—>计算机书籍网站—>Manning
- 3.2 进程的内核对象句柄表
- 面向对象设计原则概述
- Git的初次使用 ; Git常用命令查询 ; Git push ; Git pull 2011-12-16 17:32 在介绍安装和简单使用前,先看一下百度百科中的简介吧: ———————————
- 算法导论 第10章 10.2 链表
- 接口多继承其被实例化后的内存释放。
- 面向对象设计原则之里氏代换原则
- 雷锋读图:图解iPhone五年来走过的风雨历程
- android四大组件
- Mysql MERGE分表对大数据量的处理
- 基于大规模语料的新词发现算法
- 移动Web应用程序开发 HTML5篇 (一) HTML5简介
- SAP BW 学习笔记