順序鏈表-初始化、賦值、打印、取值、查找、插入、刪除、銷燬、綜合舉例

運行截圖

代碼

#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;
    }
}

 

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