双链表的各种基本运算

来源:互联网 发布:和父母关系不好知乎 编辑:程序博客网 时间:2024/06/07 06:14

输入代码:


#include<stdio.h>#include<stdlib.h>typedef char ElemType;typedef struct LNode{    ElemType data;    struct LNode *prior;    struct LNode *next;} LinkList;//建立双链表void CreateListF(LinkList *&L,ElemType a[],int n){    LinkList *s;    int i;    L=(LinkList *)malloc(sizeof(LinkList));    L->prior=L->next=NULL;    for(i=0; i<n; i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        s->next=L->next;        if(L->next!=NULL)            L->next->prior=s;        L->next=s;        s->prior=L;    }}//初始化线性表void InitList(LinkList *&L){    L=(LinkList *)malloc(sizeof(LinkList));    L->prior=L->next=NULL;}//销毁线性表void DestroyList(LinkList *&L){    LinkList *pre=L,*p=L->next;    while(p!=NULL)    {        free(pre);        pre=p;        p=pre->next;    }    free(pre);}//判断线性表是否为空表bool ListEmpty(LinkList *L){    return (L->next==NULL);}//求线性表的长度int ListLength(LinkList *L){    int n=0;    LinkList *p=L;    while(p->next!=NULL)    {        n++;        p=p->next;    }    return (n);}//输出线性表void DispList(LinkList *L){    LinkList *p=L->next;    while(p!=NULL)    {        printf("%c",p->data);        p=p->next;    }    printf("\n");}//求线性表中某个数据元素值bool GetElem(LinkList *L,int i,ElemType &e){    int j=0;    LinkList *p=L;    while(j<i&&p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)        return false;    else    {        e=p->data;        return true;    }}//按元素值查找int LocateElem(LinkList *L,ElemType e){    int i=1;    LinkList *p=L->next;    while(p!=NULL&&p->data!=e)    {        p=p->next;        i++;    }    if(p==NULL)        return (0);    else        return(i);}//插入数据元素bool ListInsert(LinkList *&L,int i,ElemType e){    int j=0;    LinkList *p=L,*s;    while(j<i-1&&p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)        return false;    else    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=e;        s->next=p->next;        if(p->next!=NULL) p->next->prior=s;        s->prior=p;        p->next=s;        return true;    }}//删除数据元素bool ListDelete(LinkList *&L,int i,ElemType &e){    int j=0;    LinkList *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;        e=q->data;        p->next=q->next;        if(p->next!=NULL)p->next->prior=p;        free(q);        return true;    }}//使元素成为递增有序排列void sort(LinkList *&L){ LinkList *p,*pre,*q; p=L->next->next; L->next->next=NULL; while(p!=NULL) {   q=p->next;   pre=L;   while(pre->next!=NULL&&pre->next->data<p->data)    pre=pre->next;   p->next=pre->next;   if(pre->next!=NULL)    pre->next->prior=p;   pre->next=p;   p->prior=pre;   p=q; }}int main(){ LinkList *L; ElemType e; int i=1; printf("(1) 初始化双链表L: \n"); InitList(L); printf("(2) 采用尾插法依次插入a,b,c,d,e :\n"); ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); printf("(3) 输出双链表 :"); DispList(L); printf("(4) 双链表的长度=%d\n" ,ListLength(L)); printf("(5) 双链表为%s\n",ListEmpty(L)?"空":"非空"); printf("(6) 双链表的第3个元素为:%c\n", GetElem(L,3,e)); printf("(7) 元素a的位置为:%d\n",LocateElem(L,'a')); printf("(8) 在第4个元素位置插入元素f :\n"); ListInsert(L,4,'f'); printf("(9) 输出双链表L: "); DispList(L); printf("(10) 删除L的第3个元素: \n"); ListDelete(L,3,e); printf("(11) 排序双链表: \n"); sort(L); printf("(12) 输出双链表: "); DispList(L); printf("(13) 释放双链表: \n"); DestroyList(L);}



运行结果:



0 0
原创粉丝点击