双链表的基本运算
Posted ygsworld
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双链表的基本运算相关的知识,希望对你有一定的参考价值。
#include<iostream> using namespace std; #include<malloc.h> typedef char ElemType; typedef struct DNode { ElemType data; struct DNode *prior; struct DNode *next; }DLinkNode; void CreateListF(DLinkNode *&L,ElemType a[],int n)//头插法 { DLinkNode *s; L = (DLinkNode*)malloc(sizeof(DLinkNode)); L->prior = L->next = NULL; for(int i =0;i<n;i++) { s = (DLinkNode *)malloc(sizeof(DLinkNode)); s->data = a[i]; s->next = L->next; if(L->next != NULL)//结点s插在原开始结点之前,头结点之后 L->next->prior = s; L->next = s; s->prior = L; } } void CreateListR(DLinkNode *&L,ElemType a[],int n)//尾插法 { DLinkNode *s,*r; L = (DLinkNode*)malloc(sizeof(DLinkNode));//头结点 L ->prior = L->next = NULL; r = L;//r始终指向终端结点。开始为头结点 for(int i = 0;i<n;i++) { s =(DLinkNode*)malloc(sizeof(DLinkNode));//创建新结点 s->data = a[i]; r->next = s;//s插入r之后 s->prior = r; r = s; } r->next = NULL; } void InitList(DLinkNode *&L) { L = (DLinkNode*)malloc(sizeof(DLinkNode)); L ->prior = L->next = NULL; } void DestoryList(DLinkNode *&L) { DLinkNode *pre = L; DLinkNode *p = L->next; while(p != NULL) { free(pre); pre = p; p = p->next;//pre p 同时后移 } free(p); } bool ListEmpty(DLinkNode *L) { return (L->next == NULL); } int ListLength(DLinkNode *L) { DLinkNode *p = L; int i = 0; while(p->next != NULL) { i++; p = p->next; } return (i); } void DispList(DLinkNode *L) { DLinkNode *p= L->next; while(p != NULL) { cout<<p->data; p = p->next; } cout<<endl; } bool GetElem(DLinkNode *L,int i,ElemType &e) { int j = 0; DLinkNode *p = L; if(i < 0) return false; while(j < i && p != NULL ) { j++; p = p->next; } if(p == NULL) { return false; } else { e = p->data; return true; } } int LocateElem(DLinkNode *L,ElemType e) { int i = 1; DLinkNode *p = L->next; while(p!= NULL && p->data != e)//查找第一个值为e的 { i++; p = p->next; } if(p == NULL) { return false; } else { return (i); } } bool ListInsert(DLinkNode *&L,int i,ElemType e) { int j = 0; DLinkNode *p = L; DLinkNode *s; if(i < 0) return false; while(p!=NULL && j < i -1)//查找待插入的前一个 { j++; p = p->next; } if(p == NULL) return false; else { s = (DLinkNode*)malloc(sizeof(DLinkNode));//找到前一个 s->data = e; s->next = p->next; if(p->next != NULL) { p->next->prior = s;//s插入p之后 } s->prior = p; p->next = s; } } bool ListDelete(DLinkNode *&L,int i,ElemType &e) { int j = 0; DLinkNode *p = L; DLinkNode *q; if(i<=0) return false; while(j < i-1 && p != NULL)//查找第i-1个 { j++; p = p->next; } if(p == NULL) { return false; } else { q = p->next;//找到 q指向第i-1个 if(q == NULL ) { return false; } else { e = q->data; p->next = q->next;//删除 if(p->next != NULL) { p->next->prior = p; } free(q);//释放q return true; } } } int main() { DLinkNode *d; ElemType e; cout<<"双链表操作"<<endl; InitList(d); ListInsert(d,1,‘a‘); ListInsert(d,2,‘b‘); ListInsert(d,3,‘c‘); ListInsert(d,4,‘d‘); ListInsert(d,5,‘e‘); cout<<"D-> "; DispList(d); cout<<"The Length is "<<ListLength(d)<<endl; cout<<"The third Elem is:"; GetElem(d,3,e); cout<<e<<endl; cout<<"Delete fourth Elem->"; ListDelete(d,4,e); DispList(d); return 1; }
运算结果
以上是关于双链表的基本运算的主要内容,如果未能解决你的问题,请参考以下文章