数据结构之双链表操作
2016-03-23 18:52
323 查看
/* 编写一个程序,实现双链表的各种基本运算(假设双链表的元素类型为Char)。 (1)初始化双链表h; (2)采用尾插法依次插入元素a,b,c,d,e; (3)输出双链表h; (4)输出双链表h长度; (5)判断双链表h是否为空; (6)输出双链表h的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置上插入元素f; (9)输出双链表h; (10)删除h的第3个元素; (11)输出双链表h; (12)释放双链表h。 */ #include <iostream> #include <malloc.h> #include <cstdio> #include <cstring> using namespace std; typedef char ElemType; typedef struct DNode { ElemType data; struct DNode *prior; struct DNode *next; } DLinklist; void InitList(DLinklist *&L) //初始化双链表h { L=(DLinklist *)malloc(sizeof (DLinklist)); L->prior=L->next=NULL; } void CreateListR(DLinklist *&L,ElemType a[],int n) //采用尾插法依次插入元素a,b,c,d,e { DLinklist *s,*r; int i; L=(DLinklist *)malloc(sizeof(DLinklist)); r=L; for(i=0; i<n; i++) { s=(DLinklist *)malloc(sizeof(DLinklist)); s->data=a[i]; r->next=s; s->prior=r; r=s; } r->next=NULL; } void DispList(DLinklist *L) //输出双链表h { DLinklist *p=L->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } int ListLength(DLinklist *L) //输出双链表h的长度 { int n=0; DLinklist *p=L; while(p->next!=NULL) { n++; p=p->next; } return (n); } bool ListEmpty(DLinklist *L) //判断双链表h是否为空 { return(L->next==NULL); } void Disp3(DLinklist *L,int j) //输出双链表h的第3个元素 { DLinklist *p=L->next; int i=1; while(i<j&&p!=NULL) { i++; p=p->next; } cout<<p->data<<endl; } void Displocation(DLinklist *L,ElemType a) //输出元素a的位置 { DLinklist *p=L->next; int i=1; while(p!=NULL) { if(p->data==a) cout<<i<<" "; p=p->next; i++; } cout<<endl; } bool ListInsert(DLinklist *&L,int i,ElemType e) //插入数据元素 { int j; DLinklist *p=L,*s; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { s=(DLinklist *)malloc(sizeof(DLinklist)); s->data=e; s->next=p->next; if(p->next!=NULL) p->next->prior=s; p->next=s; s->prior=p; return true; } } bool ListDelete(DLinklist *&L,int i) //删除数据元素 { int j=0; DLinklist *p=L,*q; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { q=p->next; if(q==NULL) return false; p->next=q->next; if(p->next!=NULL) p->next->prior=p; free(q); return true; } } void DestoryList(DLinklist *&L) //销毁双链表 { DLinklist *p=L,*q=L->next; while(q!=NULL) { free(p); p=q; q=p->next; } free(p); } int main() { char a[10]; char b='a'; gets(a); DLinklist *L; InitList(L); CreateListR(L,a,strlen(a)); cout<<"输出双链表:"; DispList(L); cout<<"双链表的长度:"<<ListLength(L)<<endl; cout<<"双链表是否为空:"; if(ListEmpty(L)) cout<<"是"<<endl; else cout<<"否"<<endl; cout<<"双链表L的第三个元素为:"; Disp3(L,3); cout<<"输出元素"<<b<<"的位置:"; Displocation(L,b); ListInsert(L,4,'f'); cout<<"已在第4个元素位置上插入元素f"<<endl; cout<<"输出双链表:"; DispList(L); ListDelete(L,3); cout<<"已删除第3个位置上的元素"<<endl; cout<<"输出双链表:"; DispList(L); DestoryList(L); cout<<"双链表已释放!"<<endl; return 0; }
运行结果:
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)