单链表的简单实现

来源:互联网 发布:规则引擎 数据库设计 编辑:程序博客网 时间:2024/06/16 04:14
#include <iostream>#include <cstdio>#include <malloc.h>typedef int ElemType;typedef bool Status;using namespace std;typedef struct LNode{    ElemType data;    struct LNode *next;}LNode,*LinkList;///逆位序输入n个元素的值,创建带有头结点的单链表void CreateList_L(LinkList &L,int n){    L=(LinkList)malloc(sizeof(LNode));    L->data=0;    L->next=NULL;    for(int i=n;i>0;i--)    {        LNode *p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&p->data);        p->next=L->next;        L->next=p;    }}///正序输入n个元素的值,创建带有头结点的单链表void CreateListNor_L(LinkList &L,int n){    L=(LinkList)malloc(sizeof(LNode));    L->data=0;    L->next=NULL;    LNode *r=L;  //最末尾的一个节点    for(int i=0;i<n;i++)    {        LNode *p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&p->data);        p->next=r->next;        r->next=p;        r=p;    }}///查找第i个位置的元素,并用e返回Status GetElem_L(LinkList L,int i,ElemType &e){  //L为带头结点的单链表    LNode *p=L->next;    int j=1;    while(p&&j<i)    {        p=p->next;        j++;    }    if(!p||j>i)        return false;    e=p->data;    return true;}///在第i个位置前面插入一个元素eStatus ListInsert_L(LinkList &L,int i,ElemType e){    LNode *p=L;    int j=0;    while(p&&j<i-1)    {        p=p->next;        j++;    }    if(!p||j>i-1)        return false;    LNode *s=(LinkList)malloc(sizeof(LNode));    s->data=e;    s->next=p->next;    p->next=s;    return true;}///删除第i个位置的元素eStatus ListDelete_L(LinkList &L,int i,ElemType &e){    LNode *p=L;    int j=0;    while(p&&j<i-1)    {        p=p->next;        j++;    }    if(!p||j>i-1)        return false;    LNode *q=p->next;    e=q->data;    p->next=q->next;    free(q);    return true;}///单链表逆序,不需要创建一个新的链表void ListReverse_L(LinkList &L){    LNode *p=L->next;    LNode *q=p->next;    while(q)    {        p->next=q->next;        q->next=L->next;        L->next=q;        q=p->next;    }}///输出单链表void ListPrint_L(LinkList L){    if(L==NULL)        printf("The list is null!\n");    else    {        LNode *p=L->next;        printf("The elements of list:\n");        while(p)        {            printf("%\d ",p->data);            p=p->next;        }        printf("\n");    }}///销毁一个单链表Status FreeList_L(LinkList &L){    if(L==NULL)        return true;    else    {        LNode *p;        while(L)        {            p=L;            L=L->next;            free(p);        }    }}///将两个非递减的单链表La,Lb合并为非递减的单链表Lcvoid MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){    LNode *pa=La->next;    LNode *pb=Lb->next;    Lc=La;    LNode *pc=Lc;    while(pa&&pb)    {        if(pa->data<=pb->data)        {            pc->next=pa;            pc=pa;            pa=pa->next;        }        else        {            pc->next=pb;            pc=pb;            pb=pb->next;        }    }    pc->next=pa?pa:pb;    free(Lb);}int main(){    LinkList LA,LB,LC;    int n=5;    printf("please input the 5 elements of list LA:\n");    CreateListNor_L(LA,5);    //CreateList_L(LA,n);    //printf("please input the 5 elements of list LB:\n");    //CreateList_L(LB,n);    ElemType e;//    GetElem_L(LA,3,e);//    printf("%d\n",e);//    ListInsert_L(LA,3,5);//    ListPrint_L(LA);//    ListDelete_L(LA,3,e);//    ListPrint_L(LA);    //MergeList_L(LA,LB,LC);    //ListReverse_L(LA);    ListPrint_L(LA);    FreeList_L(LA);    ListPrint_L(LA);    return 0;}