您的位置:首页 > 理论基础 > 数据结构算法

数据结构 —— 第一个程序 【顺序表】

2015-09-24 18:53 295 查看
顺序表的初始化、查询、扩容、插入、清空、删除、合并。

//操作的开始***********************************
//操作的进行
//操作的结束***********************************
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 1000
#define MAXM 10
#define OK 1
#define OVERFLOW -1
#define ERROR -2
#define ListAdd 10//顺序表扩容
#define ListInitsize 20//顺序表初始化尺寸
using namespace std;
typedef int Status;
typedef int ElemType;
typedef struct
{
    ElemType *elem;
    ElemType length;
    ElemType listsize;
}SqList;
SqList La, Lb, Lc;
void Sort(SqList &L)//冒泡排序
{
    for(int i = 0; i < L.length; i++)
        for(int j = 0; j < i; j++)
            if(L.elem[i] < L.elem[j])
            {
                int t = L.elem[i];
                L.elem[i] = L.elem[j];
                L.elem[j] = t;
            }
}
void Listinput(SqList &L)
{
    printf("*******************************************************************************\n");
    L.elem = (ElemType *)malloc(ListInitsize * sizeof(ElemType));
    if(!L.elem) exit(OVERFLOW);
    L.length = 0;
    L.listsize = ListInitsize;
    printf("\t\t\t\t输入元素个数\n");
    printf("\t\t\t\t");
    int n; scanf("%d", &n);
    printf("\t\t\t\t输入元素\n");
    printf("\t\t\t\t");
    for(int i = 0; i < n; i++)
        scanf("%d", &L.elem[i]);
    L.length = n;
    Sort(L);
    printf("*******************************************************************************\n");
}
void ListClear(SqList &L){
    printf("*******************************************************************************\n");
    L.length = 0;
    printf("*******************************************************************************\n");
}
void ListQuery(SqList &L)
{
    printf("*******************************************************************************\n");
    printf("\t\t\t\t输入要查询元素的位置\n");
    printf("\t\t\t\t");
    int op; scanf("%d", &op);
    if(op < 1 || op > L.length)//判断位置是否合法
    {
        printf("\t\t\t\t查询位置不合法\n");
        printf("*******************************************************************************\n");
    }
    else
    {
        printf("\t\t\t\t%d\n", L.elem[op-1]);
        printf("*******************************************************************************\n");
    }
}
void ListDelete(SqList &L)
{
    printf("*******************************************************************************\n");
    printf("\t\t\t\t输入要删除元素的位置\n");
    printf("\t\t\t\t");
    int op; scanf("%d", &op);
    if(op < 1 || op > L.length)//判断位置是否合法
    {
        printf("\t\t\t\t删除位置不合法\n");
        printf("*******************************************************************************\n");
    }
    int *p, *q;
    q = &(L.elem[L.length-1]);
    p = &(L.elem[op-1]);
    int x = *p;//存储删除的元素
    for(; p <= q; p++)
        *p = *(p+1);
    --L.length;
    printf("*******************************************************************************\n");
}
void ListInsert(SqList &L)
{
    printf("*******************************************************************************\n");
    printf("\t\t\t\t输入要插入元素的位置\n");
    printf("\t\t\t\t");
    int op; scanf("%d", &op);
    if(op < 1 || op > L.length+1)//判断位置是否合法
    {
        printf("\t\t\t\t插入位置不合法\n");
        printf("*******************************************************************************\n");
    }
    //扩容操作
    int *newbase;
    if (L.length >= L.listsize)
    {
        newbase = (ElemType *)realloc(L.elem, (L.listsize+ListAdd)*sizeof(ElemType));
        if(!newbase) exit(OVERFLOW); // 存储分配失败
        L.elem = newbase;         // 新基址
        L.listsize += ListAdd; // 增加存储容量
    }
    printf("\t\t\t\t输入要插入的元素\n");
    printf("\t\t\t\t");
    int x; scanf("%d", &x);
    int *p, *q;
    q = &(L.elem[op-1]);
    for(p = &(L.elem[L.length-1]); p >= q; p--)
        *(p+1) = *p;
    *q = x;
    ++L.length;
    printf("*******************************************************************************\n");
}
void ListMerge(SqList &La, SqList &Lb, SqList &Lc)
{
    printf("*******************************************************************************\n");
    printf("\t\t\t\t要合并的顺序表\n");
    printf("\t\t\t\t顺序表a和顺序表b合并成顺序表c\n");
    int *pa, *pb, *pc;
    pa = La.elem;  pb = Lb.elem;
    Lc.listsize = Lc.length = La.length+Lb.length;  //Lc的长度赋值
    pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
    if(!Lc.elem)  exit(OVERFLOW); //分配空间
    int *pa_last = La.elem + La.length - 1; //记录La最后元素存放地址
    int *pb_last = Lb.elem + Lb.length - 1; //记录Lb最后元素存放地址
    while(pa <= pa_last && pb <= pb_last)
    {
        if(*pa <= *pb)
            *pc++ = *pa++;
        else
            *pc++ = *pb++;
    }
    while(pa <= pa_last) *pc++ = *pa++;
    while(pb <= pb_last) *pc++ = *pb++;
    printf("*******************************************************************************\n");
}
void ListPrintf(SqList &L)
{
    printf("*******************************************************************************\n");
    printf("\t\t\t\t元素如下:\n");
    if(L.length == 0)
    {
        printf("\t\t\t\t顺序表为空\n");
        printf("*******************************************************************************\n");
    }
    int *p, *q;
    p = &(L.elem[0]);
    q = &(L.elem[L.length-1]);
    printf("\t\t\t\t");
    for(; p <= q; p++)
        printf("%d ", *p);
    printf("\n");
    printf("*******************************************************************************\n");
}
void Read_How_To_Use()
{
	printf("****************************使用前请您阅读——使用指南**************************\n");
	printf("***********************函数Listinput() —— 输入顺序表元素**********************\n");
	printf("***********************函数ListQuery() —— 查询顺序表元素**********************\n");
	printf("***********************函数ListDelete() —— 删除顺序表元素*********************\n");
	printf("***********************函数ListInsert() —— 插入顺序表元素*********************\n");
	printf("***********************函数ListClear() —— 清空顺序表元素**********************\n");
	printf("***********************函数ListPrintf() —— 输出顺序表元素*********************\n");
	printf("***********************函数ListMerge() —— 合并两个顺序表**********************\n");
	printf("*********************************返回上一步请输入0****************************\n");
}
void Chooseoperator(int kind, int op)
{
    int C;
    switch(op)
    {
        case 1:
                printf("\n\n\n");
                printf("\t\t\t\t请选择操作:\n");
                printf("\t\t\t\t1: 使用说明\n");
                printf("\t\t\t\t2: 开始使用\n");
                printf("\t\t\t\t3: 退出系统\n");
                printf("\t\t\t\t您的选择:");
                scanf("%d", &C);
                while(C < 1 || C > 3)
                {
                    printf("\t\t\t\t输入不合法,请重新输入\n");
                    printf("\t\t\t\t");
                    scanf("%d", &C);
                }
                switch(C)
                {
                    case 1: system("cls"); Read_How_To_Use();
                            printf("\t\t\t\t您的选择:");
                            scanf("%d", &C);
                            while(C != 0)
                            {
                                printf("\t\t\t\t");
                                printf("输入不合法,请重新输入\n");
                                printf("\t\t\t\t您的选择:");
                                scanf("%d", &C);
                            }Chooseoperator(1, 1); break;
                    case 2: system("cls"); Chooseoperator(1, 2); break;
                    case 3: printf("\t\t\t\t谢谢使用!\n"); exit(0);
                }
                break;

        case 2:
                printf("\n\n\n");
                printf("\t\t\t\t对链表进行操作,请选择:\n");
                printf("\t\t\t\t1: 顺序表a\n");
                printf("\t\t\t\t2: 顺序表b\n");
                printf("\t\t\t\t3: 顺序表c\n");
                printf("\t\t\t\t4: 把顺序表a和顺序表b合并成顺序表c\n");
                printf("\t\t\t\t5: 回退上一步\n");
                printf("\t\t\t\t您的选择:");
                scanf("%d", &C);
                while(C < 1 || C > 5)
                {
                    printf("\t\t\t\t输入不合法,请重新输入\n");
                    printf("\t\t\t\t您的选择:");
                    scanf("%d", &C);
                }
                if(C == 5)
                {
                    Chooseoperator(1, 1);
                    break;
                }
                system("cls");
                Chooseoperator(C, 3);
                break;

        case 3:
                printf("\n\n\n");
                printf("\t\t\t\t选择操作:\n");
                printf("\t\t\t\t1: 输入元素\n");
                printf("\t\t\t\t2: 查询元素\n");
                printf("\t\t\t\t3: 删除元素\n");
                printf("\t\t\t\t4: 插入元素\n");
                printf("\t\t\t\t5: 清空顺序表\n");
                printf("\t\t\t\t6: 输出顺序表\n");
                printf("\t\t\t\t7: 合并顺序表\n");
                printf("\t\t\t\t8: 回退上一步\n");
                printf("\t\t\t\t您的选择:");
                scanf("%d", &C);
                while(C < 1 || C > 8)
                {
                    printf("\t\t\t\t输入不合法,请重新输入\n");
                    printf("\t\t\t\t您的选择:");
                    scanf("%d", &C);
                }
                switch(C)
                {
                    case 1: system("cls");
                            switch(kind)
                            {
                                case 1: Listinput(La); break;
                                case 2: Listinput(Lb); break;
                                case 3: Listinput(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 2: system("cls");
                            switch(kind)
                            {
                                case 1: ListQuery(La); break;
                                case 2: ListQuery(Lb); break;
                                case 3: ListQuery(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 3: system("cls");
                            switch(kind)
                            {
                                case 1: ListDelete(La); break;
                                case 2: ListDelete(Lb); break;
                                case 3: ListDelete(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 4: system("cls");
                            switch(kind)
                            {
                                case 1: ListInsert(La); break;
                                case 2: ListInsert(Lb); break;
                                case 3: ListInsert(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 5: system("cls");
                            switch(kind)
                            {
                                case 1: ListClear(La); break;
                                case 2: ListClear(Lb); break;
                                case 3: ListClear(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 6: system("cls");
                            switch(kind)
                            {
                                case 1: ListPrintf(La); break;
                                case 2: ListPrintf(Lb); break;
                                case 3: ListPrintf(Lc);
                            }
                            Chooseoperator(kind, 3); break;
                    case 7: system("cls"); ListMerge(La, Lb, Lc); Chooseoperator(1, 2); break;
                    case 8: system("cls"); Chooseoperator(1, 2);
                }
    }
}
int main()
{
    printf("*******************************您好,欢迎使用本系统*****************************\n\n");
    Chooseoperator(1, 1);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: