标签:des style blog http io ar os sp for
跟单链表有点像,主要区别就在建表,插入元素,删除元素这里。
双链表数据结构为:
typedef struct DNode{ ElemType data; //节点数据 struct DNode* prior; //指向前一节点指针 struct DNode* next; //指向后一节点指针 }DLinkList;实现下列函数:
void CreateListF(DLinkList *&L,ElemType a[],int n); //头插法建表 void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表 void InitList(DLinkList *&L); //初始化链表 void DestroyList(DLinkList *&L); //销毁链表 int ListEmpty(DLinkList *L); //判断链表是否为空 int ListLength(DLinkList *L); //求链表长度 void DispList(DLinkList *L); //输出链表 int GetElem(DLinkList *L,int i,ElemType &e); //求链表里第i个节点的值,并赋值给e int LocateElem(DLinkList *L,ElemType e); //求与e值相等的第一个元素的序号 int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素 int DeleteElem(DLinkList *&L,int i,ElemType &e); //删除元素具体实现代码:
#include<stdio.h> #include<stdlib.h> #include<iostream> #define ElemType float #define GET_ARRAY_LEN(array) (sizeof(array)/sizeof(array[0])) using namespace std; typedef struct DNode{ ElemType data; //节点数据 struct DNode* prior; //指向前一节点指针 struct DNode* next; //指向后一节点指针 }DLinkList; void CreateListF(DLinkList *&L,ElemType a[],int n); //头插法建表 void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表 void InitList(DLinkList *&L); //初始化链表 void DestroyList(DLinkList *&L); //销毁链表 int ListEmpty(DLinkList *L); //判断链表是否为空 int ListLength(DLinkList *L); //求链表长度 void DispList(DLinkList *L); //输出链表 int GetElem(DLinkList *L,int i,ElemType &e); //求链表里第i个节点的值,并赋值给e int LocateElem(DLinkList *L,ElemType e); //求与e值相等的第一个元素的序号 int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素 int DeleteElem(DLinkList *&L,int i,ElemType &e); //删除元素 void CreateListF(DLinkList* &L,ElemType a[],int n){ L=(DLinkList *)malloc(sizeof(DLinkList)); L->prior=L->next=NULL; DLinkList *p=L; for(int i=0;i<n;i++){ DLinkList* addNumber=(DLinkList* )malloc(sizeof(DLinkList)); addNumber->data=a[i]; if(p->next!=NULL){ addNumber->prior=p->next->prior; addNumber->next=p->next; p->next->prior=addNumber; p->next=addNumber; } else { addNumber->prior=p; addNumber->next=NULL; p->next=addNumber; } } } void CreateListR(DLinkList* &L,ElemType a[],int n){ L=(DLinkList *)malloc(sizeof(DLinkList)); L->prior=L->next=NULL; DLinkList *p=L; for(int i=0;i<n;i++){ DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList)); addNumber->data=a[i]; addNumber->prior=p; addNumber->next=NULL; p->next=addNumber; p=p->next; } } void InitList(DLinkList* &L){ L=(DLinkList *)malloc(sizeof(DLinkList)); L->prior=L->next=NULL; } void DestroyList(DLinkList* &L){ DLinkList* p=L; DLinkList* q=L->next; while(q!=NULL){ free(p); p=q; q=q->next; } free(p); } int ListEmpty(DLinkList* L){ return(L->next==NULL); } int ListLength(DLinkList* L){ int count=0; DLinkList* p=L->next; while(p!=NULL){ count++; p=p->next; } return count; } void DispList(DLinkList* L){ DLinkList* p=L->next; while(p!=NULL){ cout<<p->data<<" "; p=p->next; } cout<<endl; } int GetElem(DLinkList* L,int i,ElemType &e){ DLinkList* p=L; int j=0; while(j<i&&p!=NULL){ p=p->next; j++; } if(i<1||p==NULL)return -1; else{ e=p->data; return 1; } } int LocateElem(DLinkList* L,ElemType e){ DLinkList* p=L->next; int i=1; while((!(-1e-9<p->data-e&&p->data-e<1e-9))&&p!=NULL){ p=p->next; i++; } if(p==NULL)return -1; else return i; } int InsertElem(DLinkList* &L,int i,ElemType e){ DLinkList* p=L->next; int j=1; while(j<i&&p!=NULL){ j++; p=p->next; } if((p==NULL&&i>j+1)||i<1)return -1; else{ DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList)); addNumber->data=e; addNumber->prior=p->prior; addNumber->next=p; p->prior->next=addNumber; p->prior=addNumber; return 1; } } int DeleteElem(DLinkList* &L,int i,ElemType &e){ DLinkList* p=L->next; int j=1; while(j<i&&p!=NULL){ j++; p=p->next; } if(i<1||p==NULL)return -1; else{ e=p->data; if(p->next!=NULL){ p->next->prior=p->prior; p->prior->next=p->next; free(p); } else{ p->prior->next=NULL; free(p); } return 1; } } int main(){ DLinkList *L=NULL; float a[]={3.4,8.7,1,3,9.7,4,5.6,3}; ElemType e; CreateListF(L,a,GET_ARRAY_LEN(a)); DispList(L); DestroyList(L); CreateListR(L,a,GET_ARRAY_LEN(a)); DispList(L); GetElem(L,4,e); cout<<e<<endl; cout<<LocateElem(L,e)<<endl; DeleteElem(L,3,e); DispList(L); InsertElem(L,1,78.4); DispList(L); cout<<ListLength(L); return 0; }
运行结果如下:
标签:des style blog http io ar os sp for
原文地址:http://blog.csdn.net/whu_sky/article/details/41025701