线性表的链式表示和实现

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define SWAP(x,y) {t=x,x=y,y=t;}

typedef int ElemType;
typedef int Status;

typedef struct LNode 
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status Create_LinkList_Head(LinkList &L,int n)//头插法
{
    LinkList s;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;

    for(int i=0 ; i<n ; i++)
    {
        if(!(s=(LinkList)malloc(sizeof(LNode))))
        {
            printf("内存分配失败!");
            exit(OVERFLOW);
        }
        scanf("%d",&s->data);
        s->next=L->next;
        L->next=s;
    }

    return OK;

}

Status Create_LinkList_Tail(LinkList &L,int n)//尾插法(顺序输出)
{
    LinkList r,s;
    L=(LinkList)malloc(sizeof(LNode));
    r=L;

    for(int i=0 ; i<n ; i++)
    {
        if(!(s=(LinkList)malloc(sizeof(LNode))))
        {
            printf("内存分配失败");
            exit(OVERFLOW);
        }
        scanf("%d",&s->data);
        r->next=s;
        r=s;
    }
    r->next=NULL;

    return OK;
}

Status Insert_LinkList(LinkList &L,int i,ElemType e)//插入节点
{
    int j=0;
    LinkList p=L,s;
    while(j<i-1 && p)
    {
        p=p->next;
        j++;
    }

    if(!p || j>i-1)
        return ERROR;

    if(!(s=(LinkList)malloc(sizeof(LNode))))
    {
        printf("内存分配失败");
        exit(OVERFLOW);
    }
    s->data=e;
    s->next=p->next;
    p->next=s;

    return OK;

}

Status Delete_LinkList(LinkList &L,int i,ElemType &e)//删除节点
{
    int j=0;
    LinkList p=L->next,q;
    while(j<i-1 && p)
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
        return ERROR;

    
    q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);

    return OK;
}

Status GetElem_LinkList(LinkList &L,int i,ElemType &e)//得到指定的节点元素
{
    int j;
    LinkList p;

    j=1,p=L->next;

    while(j<i && p)
    {
        p=p->next;
        j++;
    }
    if(!p || j>i)
        return ERROR;

    e=p->data;

    return OK;
}
Status Print_LinkList(LinkList &L)//打印链表
{
    LinkList p=L->next;

    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}
int  LinkList_Length(LinkList &L)//获取链表的长度
{
    int len=0;
    LinkList p=L->next;

    while(p)
    {
        len++;
        p=p->next;
    }
    return len;
}

Status Destory_LinkList(LinkList &L)//销毁链表
{
    LinkList p=L;

    while(p)
    {
        free(p);
        p=p->next;
    }
    free(L);
    return OK;
}
Status Sort_LinkList(LinkList &L)//排序
{
    LinkList La,Lb;
    ElemType t;

    La=L->next;
    Lb=La->next;

    while(Lb)
    {
        if(La->data>Lb->data)
        {
            SWAP(La->data,Lb->data);
        }
        Lb = Lb->next;
        if(!Lb)
        {
            La = La->next;
            Lb = La->next;
        }
    }
    return OK;
}



int main()
{
    int n,ch,pos;
    ElemType insert;
    LinkList L;
    
    printf("请输入你要输入元素的个数\n");
    scanf("%d",&n);


    printf("输入1,选择头插法(顺序),输入2,选择尾插法(逆序)\n");
    scanf("%d",&ch);
    if(ch!=1 && ch!=2)
    {
        printf("输入错误,请重新输入");
        scanf("%d",&ch);
    }
    if(ch==1)
    {
        printf("请输入%d个元素\n",n);
        Create_LinkList_Head(L,n);
    }
    else if(ch==2)
    {
        printf("请输入%d个元素\n",n);
        Create_LinkList_Tail(L,n);
    }

    printf("\n你创建的链表的长度为%d\n",LinkList_Length(L));

    printf("请输入你要插入的数据和位子(之前)\n");
    scanf("%d%d",&insert,&pos);

    Insert_LinkList(L,pos,insert);
        
    BubbleSort(L);
    Sort_LinkList(L);
    Print_LinkList(L);

    return 0;
}

    



    
    










    

数据结构->第二章->线性表的链式表示和实现

posted @ 2012-06-10 09:22  小跳蚤  阅读(831)  评论(0编辑  收藏  举报