C语言实现顺序表基本操作

C语言实现顺序表的基本操作,包括增删查操作以及顺序表的合并

SequentialList.h

#include 
#include 
#define MAXSIZE 30

typedef int DataType;
//顺序表格式定义
typedef struct
{
    DataType Data[MAXSIZE];  //数据域,存放数据
    int last;       //记录最后顺序表一个元素下标,空表为-1
}SeqList;
//定义三个顺序表LA,LB,LC
SeqList LA,LB,LC;

//判空
int IsEmpty(SeqList L);
//判满
int IsFull(SeqList L);

//初始化顺序表
int InitSeqList(SeqList* L);

//在下标i处插入数据
int InsList(SeqList* L,int i,int e);
//递增按序插入数据
int InsertList(SeqList* L,int e);

//删除下标为i的元素
int DelList(SeqList* L,int i);
//删除数据e
int DeleteList(SeqList* L,int e);

//查找并返回下标为i的元素
int GetData(SeqList L,int i);
//查找变量e并返回下标
int Locate(SeqList L,int e);

//显示L所有数据
int Show(SeqList L);

//合并有序顺序表LA,LB
int MergeList(SeqList* LA,SeqList* LB,SeqList* LC);

//状态判断函数,判断并输出操作的运行状态
int State(int i);

//对顺序表L进行操作
int Operation(SeqList* L);

//主界面
int MainMenu();

SequentialList.c

#include 
#include 
#include "SequentialList.h"

//初始化顺序表
int InitSeqList(SeqList* L)
{
    //将顺序表last值赋为-1,将顺序表置为空表
    L->last = -1;
    return 0;
}

//在下标i处插入数据
int InsList(SeqList* L,int i,int e)
{
    int j;
    if(IsFull(*L))
        return -1;      //表已满,无法插入
    if((i < 0)||(i > L->last + 1))
        return 0;       //插入位置i不合法
    if(i == L->last + 1)
    {
        L->Data[i] = e;
        L->last++;
        return 1;        //插入成功返回1
    }
    else
    {
        for(j = L->last;j >= i; j--)
            L->Data[j+1] = L->Data[j];
        L->Data[i] = e;
        L->last++;
        return 1;        //插入成功返回1
    }
}

//按递增顺序插入数据e
int InsertList(SeqList* L,int e)
{
    int i;
    if(IsEmpty(*L))
    {
        L->Data[0] = e;
        L->last++;
        return 1;     //插入成功返回1
    }
    else
    {
        for(i = 0;i <= L->last; i++ )
        {
            if(L->Data[i] > e)
                break;
        }
        return InsList(L,i,e);
         //在下标i处插入数据并返回其返回值
    }
}

//删除下标为i的元素
int DelList(SeqList* L,int i)
{
    int j;
    if((i < 0)||(i > L->last))
        return 0;           //删除位置不合法返回0
    if(i < L->last)
        for(j = i;j < L->last; j++ )
            L->Data[j] = L->Data[j+1];
    L->last--;
    return 1;               //删除成功返回1
}

//删除数据e
int DeleteList(SeqList* L,int e)
{
    int i = Locate(*L,e);
    if(i >= 0)
        return DelList(L,i);
    return -2;
}

//返回下标为i的数据
int GetData(SeqList L,int i)
{
    if((i < 0)||(i > L.last))
        return 0;        //位置不合法返回0
    return L.Data[i];           //操作成功返回1
}

//查找e返回下标
int Locate(SeqList L,int e)
{
    int i = 0;
    while((i <= L.last)&&(L.Data[i] != e))
        i++;
    if(i <= L.last)
        return i;  //找到位置则1
    return -1;         //未找到返回-2
}

//判空
int IsEmpty(SeqList L)
{
    if(L.last == -1)
        return 1;  //表为空返回1
    return 0;
}

//判满
int IsFull(SeqList L)
{
    if(L.last == MAXSIZE - 1)
        return 1;   //表已满返回1
    return 0;
}

//显示顺序表中所有元素
int Show(SeqList L)
{
    int i;
    for(i = 0;i <= L.last; i++)
        printf("\t%d. %d\n",i,L.Data[i]);
    return 0;
}

//状态判断函数,判断并输出操作的运行状态
int State(int i)
{
    if(i == -1)
        printf("\t顺序表已满\n");
    else if(i == 0)
        printf("\t输入位置不合法\n");
    else if(i == -2)
        printf("\t在顺序表中未找到该数据\n");
    else if(i == -3)
        printf("\t顺序表为空\n");
    else
        printf("\t操作成功\n");
    return 0;
}

//对顺序表进行操作
int Operation(SeqList* L)
{
    int i,e,k,m;
    //i操作数,e增删查的数据,k要操作的位置
    while(1)
    {
        system("cls");
        printf("\t1.按序插入数据e\n");
        printf("\t2.删除第k个数据\n");
        printf("\t3.删除数据e\n");
        printf("\t4.查找数据e\n");
        printf("\t5.显示所有数据\n");
        printf("\t0.返回主界面\n");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            printf("请输入要插入的数据");
            scanf("%d",&e);
            State(InsertList(L,e));
            system("pause");
            break;
        case 2:
            printf("请输入要删除数据的位置");
            scanf("%d",&k);
            State(DelList(L,k-1));
            system("pause");
            break;
        case 3:
            printf("请输入要删除的数据");
            scanf("%d",&e);
            State(DeleteList(L,e));
            system("pause");
            break;
        case 4:
            printf("请输入要查找的数据");
            scanf("%d",&e);
            m =Locate(*L,e);
            if(m >= 0)
                printf("\n%d的下标为%d\n",e,m);
            system("pause");
            break;
        case 5:
            Show(*L);
            system("pause");
            break;
        case 0:
            return 0;
            break;
        default:
            break;
        }
    }
}

//合并有序顺序表LA,LB
int MergeList(SeqList* LA,SeqList* LB,SeqList* LC)
{
    int i,j,k;
    i = j = k = 0;
    while((i <= LA->last)&&(j <= LB->last))
    if(LA->Data[i] < LB->Data[j])
    {
        LC->Data[k] = LA->Data[i];
        i++;
        k++;
    }
    else
    {
        LC->Data[k] = LB->Data[j];
        j++;
        k++;
    }
    while(i <= LA->last)
    {
        LC->Data[k] = LA->Data[i];
        i++;
        k++;
    }
    while(j <= LB->last)
    {
        LC->Data[k] = LB->Data[j];
        j++;
        k++;
    }
    LC->last = LA->last + LB->last + 1;
    return 0;
}

//主界面
int MainMenu()
{
    int i;
    printf("\t1.对顺序表LA进行操作\n");
    printf("\t2.对顺序表LB进行操作\n");
    printf("\t3.合并顺序表LA和LB\n");
    printf("\t4.查看LC\n");
    printf("\t0.退出系统\n");
    scanf("%d",&i);
    switch(i)
    {
    case 1:
        Operation(&LA);
        break;
    case 2:
        Operation(&LB);
        break;
    case 3:
        MergeList(&LA,&LB,&LC);
        break;
    case 4:
        Show(LC);
        break;
    case 0:
        exit(0);
        break;
    default:
        break;
    }
    system("pause");
    return 0;
}

main.c

#include 
#include 
#include "SequentialList.h"

int main()
{
    InitSeqList(&LA);
    InitSeqList(&LB);
    InitSeqList(&LC);
    while(1)
    {
        system("cls");
        MainMenu();
    }
    return 0;
}

你可能感兴趣的:(数据结构)