单链表实现链式线性表(C语言)

2019-05-07  本文已影响0人  Recalcitrant

单链表实现链式线性表

/*
单链表实现链式线性表
*/
#include <stdio.h>
#include <stdlib.h>
#define ElemType int        //线性表数据类型

#define OK 0                //操作成功执行
#define ERROR -1            //操作失败
#define OVERFLOW -2         //溢出
typedef int Status;

typedef struct LNode {
    ElemType data;          //数据域
    struct LNode *next;     //指针域
}LNode, *LinkList;

LinkList InitList_L();                              //1.创建
Status DestroyList_L(LinkList L);                   //2.销毁
Status ClearList_L(LinkList L);                     //3.清空
Status ListEmpty_L(LinkList L);                     //4.判空
int ListLength_L(LinkList L);                       //5.求长
ElemType GetElem_L(LinkList L, int i);              //6.访问元素
int LocateElem_L(LinkList L, ElemType e);           //7.求元素位序
ElemType PriorElem_L(LinkList L, ElemType *cur_e);  //8.求前驱
ElemType NextElem_L(LinkList L, ElemType *cur_e);   //9.求后继
Status ListInsert_L(LinkList L, int i, ElemType e); //10.插入元素
ElemType ListDelete_L(LinkList L, int i);           //11.删除元素
Status ListTraverse_L(LinkList L);                  //12.遍历



LinkList InitList_L()       //1.创建
{
    LinkList L;
    L = (LinkList)malloc(sizeof(LNode));
    L->data = 0;        //头结点数据域存储表长
    L->next = NULL;
    return L;
}
Status DestroyList_L(LinkList L)        //2.销毁
{
    LNode *p, *q;
    p = L;
    while (!p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L = NULL;
    return OK;
}
Status ClearList_L(LinkList L)      //3.清空
{
    LNode *p, *q;
    p = L->next;
    while (!p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    L->data = 0;
    L->next = NULL;
    return OK;
}
Status ListEmpty_L(LinkList L)      //4.判空
{
    if (L->data == 0) return 1;
    else return 0;
}
int ListLength_L(LinkList L)        //5.求长
{
    return L->data;
    /*
    LNode *p;
    p = L->next;
    int j = 0;
    while(p)
    {
        p = p->next;
        j++;
    }
    return j;
    */
}
ElemType GetElem_L(LinkList L, int i)      //6.访问元素
{
    LNode *p;
    p = L;
    int j = 0;
    while (p && j < i)
    {
        p = p->next;
        j++;
        if (p && j == i)return p->data;
    }
    if (!p || j > i)return ERROR;
}
int LocateElem_L(LinkList L, ElemType e)            //7.求元素位序
{
    LNode *p;
    p = L;
    int j = 0;
    p = p->next;
    while (p)
    {
        if (p->data == e)return j;
        p = p->next;
        j++;
    }
    if (!p || j > L->data)return ERROR;
}
Status ListInsert_L(LinkList L, int i, ElemType e)  //10.插入元素
{
    LNode *p, *s;
    p = L;
    int j = 0;
    while (p && j < i - 1)
    {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1)return ERROR;
    s = (LinkList)malloc(sizeof(LNode));
    if (!s)return OVERFLOW;
    s->data = e;
    s->next = p->next;
    p->next = s;
    L->data++;
    return OK;
}
ElemType ListDelete_L(LinkList L, int i)            //11.删除元素
{
    ElemType e;
    LNode *p, *q;
    p = L;
    int j = 0;
    while (p && j < i - 1)
    {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1)return ERROR;
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    L->data--;
    return e;
}
Status ListTraverse_L(LinkList L)           //12.遍历
{
    LNode *p;
    p = L;
    p = p->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    return OK;
}



int main(int argc, char *argv[])
{
    LinkList L;
    L = InitList_L();
    ListInsert_L(L, 1, 14);
    ListInsert_L(L, 1, 15);
    ListInsert_L(L, 2, 1);
    ListInsert_L(L, 3, 2);
    printf("1:%d\n",GetElem_L(L,1));
    printf("值为14的元素位序为:%d\n", LocateElem_L(L, 14));
    ListTraverse_L(L);
    ListDelete_L(L, 2);
    printf("\n删除后:");
    ListTraverse_L(L);


    DestroyList_L(L);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读