顺序链表-初始化、赋值、打印、取值、查找、插入、删除、销毁、综合举例

运行截图

代码

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

#define MAXSIZE 100
#define ElemType int
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef struct
{
    ElemType *elem;
    int length;
} SqList;

void menu();
Status InitList(SqList &L);                      //初始化链表
Status CreatList(SqList &L);                     //赋值
Status PrintList(SqList &L);                     //打印顺序表
Status GetElem(SqList &L, int i, ElemType &e);   //顺序表的取值
int Locate(SqList &L, ElemType e);               //顺序表的查找
Status ListInsert(SqList &L, int i, ElemType e); //顺序表的插入
Status ListDelete(SqList &L, int i);             //顺序表的删除
void DestoryList_Sq(SqList &L);                  //销毁顺序表
void UnionSqlist(SqList &la, SqList &lb);        //举例应用1
void purge(SqList &la, SqList &lb);              //构造线性表la,使其只包括lb中所有值不同的数据元素
Status isequal(SqList &la, SqList &lb);          //若线性表la和lb不仅长度相等,且所含数据元素也相同,则返回OK

void menu()
{
    printf("\n");
    printf("*********顺序表基本功能的实现**********\n");
    printf("*********1---初始化顺序表    **********\n");
    printf("*********2---赋值顺序表      **********\n");
    printf("*********3---打印顺序表      **********\n");
    printf("*********4---取值            **********\n");
    printf("*********5---查找元素是否存在**********\n");
    printf("*********6---插入元素        **********\n");
    printf("*********7---删除元素        **********\n");
    printf("*********0---退出            **********\n");
    printf("\n");
}

int main()
{
    int e;
    int locate;
    SqList L;
    int select;

    while (1)
    {
        menu();
        printf("请输入您要实现的功能:\n");
        scanf("%d", &select);
        switch (select)
        {
        case 1:
            if (InitList(L))
                printf("初始化成功\n");
            else
                printf("初始化失败\n");
            break;
        case 2:
            CreatList(L);
            break;
        case 3:
            PrintList(L);
            break;
        case 4:
            printf("请输入元素的位置:\n");
            scanf("%d", &locate);
            if (GetElem(L, locate, e))
                printf("第%d个位置上的数为%d", locate, e);
            else
                printf("取值失败.\n");
            break;
        case 5:
            printf("请输入要查找的元素:");
            scanf("%d", &e);
            locate = Locate(L, e);
            if (locate)
                printf("\n该元素在列表的位置是%d\n", locate);
            else
                printf("\n不存在该元素\n");
            break;
        case 6:
            printf("请输入您要插入的位置和元素值:\n");
            scanf("%d%d", &locate, &e);
            printf("*********插入前************\n");
            PrintList(L);
            if (ListInsert(L, locate, e))
            {
                printf("插入成功\n");
                printf("*********插入后************\n");
                PrintList(L);
            }
            else
                printf("插入失败\n");
            break;
        case 7:
            printf("请输入您要删除的位置:\n");
            scanf("%d", &locate);
            printf("*********删除前************\n");
            PrintList(L);
            if (ListDelete(L, locate))
            {
                printf("删除成功\n");
                printf("*********删除后************\n");
                PrintList(L);
            }
            else
                printf("删除失败\n");
            break;
        case 0:
            return 0;
        default:
            printf("对不起,暂没有该功能。\n");
        }
    }

    SqList la, lb;
    /*
    UnionSqlist(la,lb);
    printf("*****两表合并后的结果为:*******\n");
    PrintList(la);
    printf("目前la表的表长为:%d\n",la.length);
    */

    //对线性表lb提纯
    /* purge(la,lb); */

    //比较两个列表是否相等
    if (isequal(la, lb))
        printf("la和lb相等。\n");
    else
        printf("la和lb不相等。\n");

    return 0;
}

Status InitList(SqList &L)
{
    L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));
    if (!L.elem)
        exit(OVERFLOW);
    L.length = 0;
    return OK;
}

Status CreatList(SqList &L)
{
    int num, i;
    printf("******现在开始赋值********\n");
    printf("请输入总个数:\n");
    scanf("%d", &num);
    for (i = 0; i < num; i++)
    {
        printf("请输入第%d个数:", i + 1);
        scanf("%d", &L.elem[i]);
        L.length++;
    }

    if (L.length == num)
        return OK;
    else
        return ERROR;
}

Status PrintList(SqList &L)
{
    if (!L.length)
        return ERROR;
    int i = 0;
    printf("*******打印开始********\n");
    for (; i < L.length; i++)
        printf("%d ", L.elem[i]);
    printf("\n");
    printf("*******打印结束********\n");
    return OK;
}

Status GetElem(SqList &L, int i, ElemType &e)
{
    if (i < 1 || i > L.length)
        return ERROR;
    e = L.elem[i - 1];
    return OK;
}

int Locate(SqList &L, ElemType e)
{
    int i = 0;
    for (; i < L.length; i++)
        if (e == L.elem[i])
            return i + 1;
    return 0;
}

Status ListInsert(SqList &L, int i, ElemType e)
{
    //1.判断是否合法
    if (i < 1 || i > L.length + 1)
        return ERROR;

    //2.判断顺序表的存储空间是否已满,若满则返回error.
    if (L.length == MAXSIZE)
        return ERROR;

    //3.将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。
    int j;
    for (j = L.length - 1; j >= i - 1; j--)
        L.elem[j + 1] = L.elem[j];

    //4.将要插入的新元素e放入第i个位置
    L.elem[i - 1] = e;

    //5.表长加1.
    L.length++;

    return OK;
}

Status ListDelete(SqList &L, int i)
{
    //1、判断删除位置是否合法,若不合法则返回ERROR.
    if (i < 1 || i > L.length)
        return ERROR;

    //2、将第i+1个至第n个元素依次向前移动一个位置

    int j;
    for (j = i; j < L.length; j++)
        L.elem[j - 1] = L.elem[j];

    //3、表长减1
    L.length--;

    return OK;
}

void DestoryList_Sq(SqList &L)
{
    delete[] L.elem;
    L.length = 0;
}

void UnionSqlist(SqList &la, SqList &lb)
{
    //将线性表lb中所欲在la中不存在的元素插入到la中,算法执行结束后,线性表lb将不再存在

    //初始化la、lb并赋值
    InitList(la);
    InitList(lb);
    printf("请给la表赋值:\n");
    CreatList(la);
    printf("请给lb表赋值:\n");
    CreatList(lb);
    //打印检查
    PrintList(la);
    PrintList(lb);

    int i = la.length, j = 0;

    while (j <= lb.length - 1)
    {
        if (Locate(la, lb.elem[j]))
            j++;
        else
        {
            la.elem[i] = lb.elem[j];
            la.length++;
            i++;
            j++;
        }
    }

    DestoryList_Sq(lb);
}

void purge(SqList &la, SqList &lb)
{
    //构造线性表la
    InitList(la);
    //初始化并给lb赋值
    InitList(lb);
    CreatList(lb);

    int j = 0, i = 0;
    while (j < lb.length)
    {
        if (Locate(la, lb.elem[j]))
            j++;
        else
        {
            ListInsert(la, i, lb.elem[j]);
            i++;
        }
    }

    //打印la
    printf("原始数列是:\n");
    PrintList(lb);
    printf("提纯后:\n");
    printf("la的长度为%d:\n", la.length);
    PrintList(la);

    //销毁lb
    DestoryList_Sq(lb);
}

Status isequal(SqList &la, SqList &lb)
{
    //初始化la,lb,lc;
    InitList(la);
    InitList(lb);

    //给la和lb赋值
    CreatList(la);
    CreatList(lb);

    int lena = la.length;
    int lenb = lb.length;
    if (lena != lenb)
        return ERROR;
    else
    {
        SqList lc;
        InitList(lc);
        //把la的值赋值一份给lc
        int i = 0;
        for (; i < la.length; i++)
        {
            lc.elem[i] = la.elem[i];
            lc.length++;
        }

        //打印la和lc进行验证
        /* printf("la为:\n");
        PrintList(la);
        printf("lc为:\n");
        PrintList(lc);*/

        //进行比较
        int j = 0;
        for (; j < lenb; j++)
        {
            if (Locate(lc, lb.elem[j]))
                ListDelete(lc, lb.elem[j]);
        }
        if (lc.length == 0)
            return OK;
        else
            return ERROR;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章