我的线性表(顺序表)

啦啦啦……写了将近一上午,功能不太全,只写了老师要求写的功能,待会儿我把其他功能补充下再粘贴一个

这个只有1:定义线性表,2:初始化线性表,3:删除第i个位置的元素,4:删除值为e的元素,5:查找第i个位置上的元素,6:打印顺序表 7:销毁顺序表

#include <stdio.h>
#include <malloc.h>
#define LISTINCREMENT 10
typedef struct
{
    int *elem;
    int length;
    int listsize;
}SqList;

void printMenu();//打印功能选择菜单
bool initListSq(SqList &L, int len); //初始化线性表,成功则返回1,失败返回0
bool listInsertSq(SqList &L, int i, int e);//在线性表的第i个位置插入元素e
bool listDataDeleteSq(SqList &L, int &i, int e); //删除顺序表中元素e,并返回它的位置i
bool listLocationDeleteSq(SqList &L, int i, int &e);//删除顺序表中第i个位置的元素,并返回元素的值e
bool locateElemSq(SqList &L, int &i, int e);//查找某个元素,找到则返回它的位置,否则返回0
void listPrintSq(SqList &L); //打印该线性表
void destorySq(SqList &L); //销毁该线性表

void printMenu()
{
    printf("  请选择对该线性表的操作:\n");
    printf("1:插入一个元素\n");
    printf("2:删除顺序表中第i个元素,并输出它的值e\n");
    printf("3:删除顺序表中的元素e,并输出其位置\n");
    printf("4:查找某个元素,找到则输出它的位置,否则输出0\n");
    printf("5:打印该顺序表\n");
    printf("6:销毁该顺序表\n");
    printf("q:退出程序\n");
}
int main()
{
    int len, quik = 0;
    SqList La;
    char choice;
    printf("请输入建立的顺序表的元素个数:");
    scanf("%d", &len);
    initListSq(La, len);
    for(;;) //用户在选择退出之前可以根据菜单随意对线性表进行操作;
    {
        int i, e;
        bool check;
        printMenu();
        getchar();
        scanf("%c", &choice);
        switch(choice)
        {
        case '1':
            printf("请输入要插入的元素位置和元素的值:(1 <= i <= %d)", La.length+1);
            scanf("%d%d", &i, &e);
            check = listInsertSq(La, i, e);
            if(check)
                printf("插入成功!\n");
            else
                printf("插入失败!(请检查输入的位置是否在合法范围)\n");
            break;
        case '2':
            printf("请输入要删除的元素的位置:");
            scanf("%d", &i);
            check = listLocationDeleteSq(La, i, e);
            if(check)
                printf("删除成功!\n");
            else
                printf("删除失败!(请检查输入的位置的范围或者该表是否为空)\n");
            break;
        case '3':
            printf("请输入要删除的元素的值:");
            scanf("%d", &e);
            check = listDataDeleteSq(La, i, e);
            if(check == 1)
                printf("删除成功!\n");
            else
                printf("删除失败!(请检查您输入的值是否存在于线性表中)");
            break;
        case '4':
            printf("请输入要查找的元素:");
            scanf("%d", &e);
            check = locateElemSq(La, i, e);
            if(check)
                printf("找到了,该元素在线性表中的第%d个位置上\n", i);
            else
                printf("sorry, 没找到哎,要不您再检查一下输入的元素是否是线性表中的元素?");
        case '5':
            listPrintSq(La);
            break;
        case '6':
                destorySq(La);
                printf("销毁完成!\n");
        case 'q':
            quik = 1;break;
        default:
            printf("您输入的数字不在范围内,请重新输入\n");
        }
        if(quik)
        {
            printf("感谢您的使用,再见\n");
            break;
        }
    }
    return 0;
}

bool initListSq(SqList &L, int len) //构造一个空的线性表,成功则返回1,失败返回0
{
    L.elem = (int *)malloc(len*sizeof(int));
    if(!L.elem) exit(0);
    L.length = 0;
    L.listsize = len;
    return 1;
}
bool listInsertSq(SqList &L, int i, int e)
{
    //在顺序线性表中第i个位置插入新的元素e
    //i的范围 1 <= i <= L.listsize + 1
    if(i < 1 || i > L.length+1) return 0;
    if(L.length >= L.listsize)
    {
        int *newbase = (int *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase) exit(0); //存储分配失败
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    int *q = &(L.elem[i-1]), *p;
    for(p = &(L.elem[L.length-1]); p >= q; p--) *(p+1) = *p;
    *q = e;
    ++L.length;
    return 1;
}
bool listLocationDeleteSq(SqList &L, int i, int &e)//删除顺序表中第i个位置上的元素,并用e返回其值
{
    //i的范围:1 <= i <= L.listsize;
    if(L.length == 0) return 0;
    if(i < 1 || i > L.listsize) return 0;
    int *p = &(L.elem[i-1]), *q;
    e = *p;
    q = L.elem + L.listsize;
    for(p++; p < q; p++) *(p-1) = *p;
    --L.length;
    return 1;
}
bool locateElemSq(SqList &L, int &i, int e)//查找某个元素,找到则返回它的位置,否则返回0
{
    if(L.length == 0) return 0;
    i = 1;
    while(i <= L.length && L.elem[i-1] != e) ++i;
    if(i <= L.length) return 1;
    else return 0;
}
bool listDataDeleteSq(SqList &L, int &i, int e)//删除顺序表中值为e的元素,并用i返回它的位置
{
    if(L.length == 0) return 0;
    int i1;
    bool flag;
    flag = locateElemSq(L, i1, e);
    if(flag)
    {
        listLocationDeleteSq(L, i1, e);
        return 1;
    }
    else
        return 0;
}

void listPrintSq(SqList &L) //打印该线性表
{
    if(L.length == 0) {printf("该顺序表为空\n"); return ;}
    printf("该顺序表如下:\n");
    for(int i = 0; i < L.length; i++)
    {
        printf("%d ", L.elem[i]);
        if(i != 0 && i % 6 == 0)
            printf("\n");
    }
    printf("\n");
}
void destorySq(SqList &L) //销毁该线性表
{
    free(L.elem);
}

 

posted on 2015-10-01 17:16  张明明_1  阅读(322)  评论(0编辑  收藏  举报

导航