C语言-(单-双)链表

来源:互联网 发布:网络违法犯罪举报电话 编辑:程序博客网 时间:2024/05/16 12:28

用C语言写一个链表的模版
单链表

#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;}LinkList;/*---建立单链表---*//*---头插法建表---*/void CreateListF(LinkList * &L,ElemType a[],int n){    LinkList *s;    int i;    L=(LinkList *)malloc(sizeof(LinkList));    L->next=null;    for(i=0;i<n;i++)    {        s=(LinkList)malloc(sizeof(LinkList));        s->data=a[i];        s->next=L->next;        L->next=s;                                         }}/*---尾插法建表---*/ void CreateListR(LinkList * &L,ElemType a[],int n){    LinkList *s,*r;    int i;    L=(LinkList *)malloc(sizeof(LinkList));    r=L;    for(i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        r->next=s;        r=s;    }    r->next=NULL;}/*---初始化线性表---*/void InitList(LinkList * &L){    L=(LinkList *)malloc(sizeof(LinkList));    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("%d",p->next);        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;        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;        free(q);        return true;    }   }

双链表

#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct DNode{    ElemType data;    struct DNode *prior;    struct DNode *next;}DLinkList;/*---建立双链表---*//*---头插法建表---*/void CreateListF(DLinkList * &L,ElemType a[],int n){    DLinkList *s;    int i;    L=(DLinkList *)malloc(sizeof(DLinkList));    L->prior=L->next=NULL;    for(i=0;i<n;i++)    {        s=(DLinkList *)malloc(sizeof(DLinkList));        s->data=a[i];        s->next=L->next;        if(L->next!=NULL)        {            L->next->prior=s;        }                            L->next=s;        s->prior=L;                   }}/*---尾插法建表---*/ void CreateListR(DLinkList * &L,ElemType a[],int n){    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;}/*---在双链表L中第i个位置上插入值为e的节点*/bool ListInsert(DLinkList * &L,int i,ElemType e){    int j=0;    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;        }         s->prior=p;        p->next=s;        return true;    }} /*---在双链表L删除第i个节点---*/bool ListDelete(DLinkList * &L,int i,ElemType e) {    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;        }        e=q->data;        p->next=q->next;        if(p->next!=NULL)        {            p->next->prior=p;        }         free(q);        return true;    }   }int main(){    return 0;}

欢迎关注我的微信个人订阅号
这里写图片描述
每天多学一点0.0

0 0
原创粉丝点击