双向链表(不带头结点)
2014-10-21 23:58
267 查看
双向链表(不带头结点)
转自:http://toigel.blog.51cto.com
转自:http://toigel.blog.51cto.com
// 双向链表写的少,总是忘记指定一个结点的前驱。 // 头文件: #include <iostream> using namespace std; typedef struct Node {//结点结构 int value; struct Node *pre,*next;//前驱指针和后继指针 }Node,*Link; typedef struct List {//链表结构 Link head,tail; int length; }List,*LinkList; LinkList NewList(void) {//构造一个空的链表 LinkList list; list=new List; list->head=list->tail=NULL; list->length=0; return list; } int ListLength(List list) { return list.length; } bool IsListEmpty(List list) { if(list.length==0) return true; return false; } void ClearList(LinkList list) {//清空链表,并释放每个结点的空间 Link p,q; p=list->head; while(p!=list->tail) { q=p->next; free(p); p=q; } free(p);//释放尾结点 list->tail=list->head=NULL; list->length=0; } void DestroyList(LinkList list) { ClearList(list); free(list->head); free(list->tail); } void InsertElemToList(LinkList list,int pos,int elem) { Link p; p=new Node; p->value=elem; if(pos<1 || pos>ListLength(*list)+1) cout<<"The position is invalidate."<<endl; else { if(pos==1) {//插在表头 if(IsListEmpty(*list)) { list->head=list->tail=p; p->next=NULL; } else { p->next=list->head; list->head->pre=p; list->head=p; } } else if(pos==ListLength(*list)+1) {//插在表尾 list->tail->next=p; p->pre=list->tail; list->tail=p; p->next=NULL; } else { Link q=list->head; for(int i=1;i<pos-1;++i) {//找到pos-1位置的结点 q=q->next; } p->next=q->next; p->pre=q; q->next->pre=p; q->next=p; } ++list->length; } } void DeleteElemFromList(LinkList list,int pos,int &elem) { if(IsListEmpty(*list)) { cout<<"The list is empty,you can't delete element."<<endl; } else { if(pos<1 || pos>ListLength(*list)) {//删除位置不正确 cout<<"The position is invalidate."<<endl; return;//如果条件不成立,就结束 } else { if(pos==1) {//删除表头 if(ListLength(*list)==1) {//表长为1 Link p=list->head; list->head=list->tail=NULL; elem=p->value; free(p); } else {//表长大于1 Link p=list->head; list->head=p->next; p->next->pre=NULL; elem=p->value; free(p); } } else if(pos==ListLength(*list)) {//删除表尾 Link q=list->tail; list->tail=q->pre; list->tail->next=NULL; elem=q->value; free(q); } else { Link p=list->head; for(int i=1;i<pos;++i) {//找到pos位置的结点 p=p->next; } p->pre->next=p->next; p->next->pre=p->pre; elem=p->value; free(p); } --list->length; } } } bool PreElem(List list,int pos,int &elem) {//判断 pos位置的结点有无前驱,若有则将其值存入elem if(pos<1 || pos>ListLength(list)) { cout<<"The position is invalidate."<<endl; return false; } else { if(pos==1) { cout<<"This position doesn't have a pre_element."<<endl; return false; } else { Link p=list.head; for(int i=1;i<pos;++i) {//找到pos位置处结点 p=p->next; } elem=p->pre->value; return true; } } } bool NextElem(List list,int pos,int &elem) { if(pos<1 || pos>ListLength(list)) { cout<<"The position is invalidate."<<endl; return false; } else { if(pos==ListLength(list)) { cout<<"This position doesn't have a next_element."<<endl; return false; } else { Link p=list.head; for(int i=1;i<pos;++i) {//找到pos位置处结点 p=p->next; } elem=p->next->value; return true; } } } bool CurrentElem(List list,int pos,int &elem) { if(pos<1 || pos>ListLength(list)) { cout<<"The position is invalidate."<<endl; return false; } else { Link p=list.head; for(int i=1;i<pos;++i) { p=p->next; } elem=p->value; return true; } } bool GetHead(List list,int &elem) {//如果链表不空,则返回表头元素,用elem接收 if(IsListEmpty(list)) { cout<<"The list is empty."<<endl; return false; } else { elem=list.head->value; return true; } } bool GetTail(List list,int &elem) {//如果链表不空,则返回表尾元素,用elem接收 if(IsListEmpty(list)) { cout<<"The list is empty."<<endl; return false; } else { elem=list.tail->value; return true; } } void VisitElemFromList(List list) { Link p=list.head; if(!IsListEmpty(list)) { while(p) { cout<<p->value<<' '; p=p->next; } cout<<endl; } }
// 测试代码: #include "stdafx.h" #include <conio.h> #include "double_direction_list.h" int _tmain(int argc, _TCHAR* argv[]) { LinkList list; list=NewList(); if(IsListEmpty(*list)) cout<<"The list is empty."<<endl; cout<<"The length of the list is:"<<ListLength(*list)<<endl; InsertElemToList(list,1,3); InsertElemToList(list,1,5); InsertElemToList(list,ListLength(*list)+1,8); VisitElemFromList(*list); InsertElemToList(list,-1,2); InsertElemToList(list,9,21); int elem; DeleteElemFromList(list,1,elem); VisitElemFromList(*list); InsertElemToList(list,1,22); InsertElemToList(list,1,45); InsertElemToList(list,4,23); InsertElemToList(list,ListLength(*list),90); InsertElemToList(list,ListLength(*list)+1,88); VisitElemFromList(*list); int e; if(GetHead(*list,e)) { cout<<"The head_elem of the list is:"<<e<<endl; } if(GetTail(*list,e)) { cout<<"The tail_elem of the list is:"<<e<<endl; } cout<<"The length of the list is:"<<ListLength(*list)<<endl; DeleteElemFromList(list,2,elem); VisitElemFromList(*list); DeleteElemFromList(list,ListLength(*list),elem); VisitElemFromList(*list); DeleteElemFromList(list,1,elem); VisitElemFromList(*list); if(GetHead(*list,e)) { cout<<"The head_elem of the list is:"<<e<<endl; } if(GetTail(*list,e)) { cout<<"The tail_elem of the list is:"<<e<<endl; } cout<<"The length of the list is:"<<ListLength(*list)<<endl; DeleteElemFromList(list,ListLength(*list)+1,elem); DeleteElemFromList(list,-2,elem); int temp; if(PreElem(*list,4,temp)) cout<<"The pre_element of this position is:"<<temp<<endl; if(PreElem(*list,1,temp)) cout<<"The pre_element of this position is:"<<temp<<endl; if(PreElem(*list,12,temp)) cout<<"The pre_element of this position is:"<<temp<<endl; if(NextElem(*list,2,temp)) cout<<"The nex_element of this position is:"<<temp<<endl; if(NextElem(*list,ListLength(*list),temp)) cout<<"The next_element of this position is:"<<temp<<endl; if(NextElem(*list,-3,temp)) cout<<"The next_element of this position is:"<<temp<<endl; if(CurrentElem(*list,2,temp)) cout<<"The current_element of this position is:"<<temp<<endl; if(CurrentElem(*list,ListLength(*list)+2,temp)) cout<<"The current_element of this position is:"<<temp<<endl; ClearList(list); DeleteElemFromList(list,1,temp); getch(); return 0; }
相关文章推荐
- 带头结点的双向循环链表
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- 双向循环链表的建立,插入,删除(不带头结点)
- 建立带头结点的双向链表_尾插法
- 数据结构:带头结点的双向循环链表
- 用模板实现顺序表和带头结点的双向循环链表
- !-- 带头结点带环的双向链表的相关操作实现 --!
- 带头结点的双向循环链表
- 程序一:带头结点双向链表的简单实现
- C++模板实现双向循环链表(有带头结点)
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- 判断带头结点的双向循环链表L是否对称相等的算法
- 线性表和带头结点的双向循环链表
- 向带头结点的双向链表中第i个位置之前插入元素e
- C语言实现双向非循环链表(带头结点尾结点)的节点插入
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- 数据结构-带头结点带环的双向链表基本操作
- 带头结点的双向链表
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 设以带头结点的双向循环链表表示的线性表L=(a1,a2,……,an)。