1.1线性表的顺序表示

Posted huang-changfan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.1线性表的顺序表示相关的知识,希望对你有一定的参考价值。

数据结构(C语言版),严蔚敏,吴伟明著。

线性表的顺序表示,C语言实现:

文件目录结构:

技术分享图片

Define.h源码:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define Status int
#define LIST_INIT_SIZE 12
#define LISTINCREMENT 10

 

SqList.h源码:

#include "Define.h"
#define ElemType int
typedef struct{
    ElemType* elem;
    int length;
    int listsize;
}SqList;

void SqListt_Menu();
Status InitList_SqList(SqList * L); //初始化线性表
Status ListInsert_Sq(SqList * L, int i, ElemType e);//将e插入L中,插入位置为i
Status compare(ElemType p, ElemType e);//比较函数
int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType));//获取指定元素下标
Status ListDelete_Sq(SqList* L, int i, ElemType *e);//删除L中位置为i的元素
void MergeList_Sq(SqList La, SqList Lb, SqList *Lc);//合并La,Lb放入Lc中
Status DestroyList(SqList *L);//销毁线性表

 

SqList.c源码:

#include "SqList.h"
#include "stdio.h"
#include "stdlib.h"


/*初始化顺序表
 * 初始长度为12
 */
Status InitList_SqList(SqList * L){ //初始化线性表
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); //分配空间,初始化空间为12
    if(!L->elem) //判断是否分配成功
        exit(OVERFLOW);
    L->length = 0;  //空表长度为0
    L->listsize = LIST_INIT_SIZE; //初始化存储容量
    return OK;
}

/*在线性表第i个位置插入元素e
 *
 */
Status ListInsert_Sq(SqList * L, int i, ElemType e){
    int p = i - 1; //p为元素移动起始位
    int q = (L->length) - 1;//q为元素移动终止位
    if(i < 1 || i > L->length + 1){//判断插入位是否合法。
        printf("插入位不合法
");
        return ERROR;
    }
    if(L->length >= L->listsize){//当前存储空间已满,增加分配
        ElemType * newbase;
        newbase = (ElemType *)realloc(L->elem,
            (L->listsize + LISTINCREMENT) * sizeof(ElemType));//分配增量为10(LISTINCREMENT)
        if(!newbase){
            printf("分配失败
");
            exit(OVERFLOW);
        }
        L->elem = newbase;//增加分配后的新地址
        L->listsize += LISTINCREMENT;//更新存储容量
    }
    for(; q >= p; --q)//将插入位置及以后的元素右移
        L->elem[q + 1] = L->elem[q];
    L->elem[p] = e;//插入e
    ++L->length;//表长加1
    return OK;
}

/*比较函数
 *
 */
Status compare(ElemType p, ElemType e){
    if(p == e)
        return TRUE;
    else
        return FALSE;
}

/*在线性表L中查找第一个满足computer()的元素的位置
 *如果找到,则返回对应位置,反之返回0。
 */
int LocateElem_Sq(SqList *L, ElemType *e, Status(*compare)(ElemType,ElemType)){
    int i = 1;
    while(i <= L->length && !(*compare)(L->elem[i - 1], *e)) ++i;//遍历L中的元素,并判断是否符合条件
    if(i <= L->length) //判断是否超出范围
        return i;
    else
        return 0;
}

/*在线性表L中删除第i个元素,并用e返回其值。
 *
 */

Status ListDelete_Sq(SqList* L, int i, ElemType *e){
    int p = i - 1, q = L->length - 1;//i为插入位置从1开始,p为顺序表实际插入位置0开始
    if(i < 1 || i > L->length)       //q为顺序表中最后一个元素的下标。
        return ERROR;
    *e = L->elem[i-1];//将需要删除的元素用e返回
    for(; p < q; p++)//将第i个元素之后的元素右移一位。
        L->elem[p] = L->elem[p + 1];
    --L->length;//表长减1
    return OK;
}


/*已知La,Lb按递增排列
 *合并La,Lb放入Lc中,Lc也按递增排列。
 */

void MergeList_Sq(SqList La, SqList Lb, SqList *Lc){
    ElemType *pa = La.elem, *pb = Lb.elem, *pc;//pa,pb存放顺序表起始地址,用于遍历元素
    ElemType *pa_last, *pb_last;//用于存放顺序表最后一个元素地址
    pa = La.elem;
    pb = Lb.elem;
    Lc->listsize = Lc->length = La.length + Lb.length;//将Lc的存储容量设置为La和Lb当前长度之和
    pc = Lc->elem = (ElemType *)malloc(Lc->length * sizeof(ElemType));//为Lc->elem分配空间
    if(!Lc->elem)//存储分配失败则退出
        exit(OVERFLOW);
    pa_last = La.elem + La.length - 1;//pa_last为顺序表中最后一个元素的地址
    pb_last = Lb.elem + Lb.length - 1;
    while(pa <= pa_last && pb <= pb_last){
        if(*pa <= * pb)       //将La,Lb中的元素按递增排列插入Lc中
            *pc++ = *pa++;
        else
            *pc++ = *pb++;
    }
    while(pa <= pa_last)//将剩余未插入的元素插入Lc中
        *pc++ = *pa++;
    while(pb <= pb_last)
        *pc++ = *pb++;
}

Status DestroyList(SqList *L){
    if(L){
        free(L->elem);
        return OK;
    }else
        return ERROR;
}

 

Main.c源码

#include "stdio.h"
#include "stdlib.h"
#include "SqList.h"

#define MenuFun 6

void SqList_Menu();

int main(){
    SqList_Menu();
    return 0;
}


void SqList_Menu(){
    int temp = -1;//第二组数据赋值使用
    SqList L, La, Lb, Lc;
    int input;
    int i;
    ElemType e;
    printf("--------------数据结构--------------
");
    printf("1.初始化线性表,初始长度为12.
");
    printf("2.在线性表第i个位置插入元素e
");
    printf("3.删除第i个元素
");
    printf("4.查找第一个满足computer()的元素的位置
");
    printf("5.合并La、Lb,放入Lc中
");
    printf("6.销毁顺序表");
    printf("------------------------------------

");
    printf("请输入序号选择功能
");
    scanf("%d", &input);
    for(;!CheckInput(input,CheckInit(input));){
        scanf("%d", &input);
    }
    for(;;){
        switch(input){
            case 1:if(InitList_SqList(&L) && InitList_SqList(&La) && InitList_SqList(&Lb)){
                        /*/第一组初值
                        for(i = 1; i <= 12; i++){
                            ListInsert_Sq(&L,i,i);
                            ListInsert_Sq(&La,i,i);
                            ListInsert_Sq(&Lb,i,i);
                        }
                        //*/
                        
                        //第二组初值
                        for(i = 1; i <= 12; i++)
                            ListInsert_Sq(&L, i, (i*i+1)/2);
                        for(i = 1; i <= 12; i++)
                            ListInsert_Sq(&La,i,temp+=2);
                        temp = 0;
                        for(i = 1; i <= 12; i++)
                            ListInsert_Sq(&Lb,i,temp+=2);
                         //*/
                        printf("初始化成功

");
                        printf("分配初始值...
");
                        printf("L :");
                        for(i = 0; i < L.length; i++)
                            printf("%d ", L.elem[i]);
                        putchar(
);
                        printf("La:");
                        for(i = 0; i < La.length; i++)
                            printf("%d ", La.elem[i]);
                        putchar(
);
                        printf("Lb:");
                        for(i = 0; i < Lb.length; i++)
                            printf("%d ", Lb.elem[i]);
                        putchar(
);
                        putchar(
);
                   }else
                       printf("初始化失败
");
                   break;
            case 2:printf("插入前的线性表:");
                for(i = 0; i < L.length; i++)
                    printf("%d ",L.elem[i]);
                putchar(
);
                printf("请输入插入位置(i)及插入元素(e)");
                scanf("%d %d", &i, &e);
                if(ListInsert_Sq(&L, i, e) == OK)
                    printf("插入成功
",e);
                else{
                    printf("插入失败
");
                    break;
                }
                printf("插入后的线性表:");
                for(i = 0; i < L.length; i++)
                    printf("%d ",L.elem[i]);
                putchar(
);
                putchar(
);
                break;
            case 3:printf("删除前的线性表:");
                for(i = 0; i < L.length; i++)
                    printf("%d ",L.elem[i]);
                putchar(
);
                printf("请输入需要删除元素的位置(i)");
                scanf("%d", &i);
                if(ListDelete_Sq(&L, i, &e) == OK)
                    printf("删除成功
",e);
                else{
                    printf("删除失败
");
                    break;
                }
                printf("删除元素:%d",e);
                putchar(
);
                printf("删除后的线性表:");
                for(i = 0; i < L.length; i++)
                    printf("%d ",L.elem[i]);
                putchar(
);
                putchar(
);
                break;
            case 4:printf("当前线性表:");
                for(i = 0; i < L.length; i++)
                    printf("%d ",L.elem[i]);
                putchar(
);
                printf("请输入需要查找的元素(e)");
                scanf("%d", &e);
                if(LocateElem_Sq(&L, &e, &compare) != 0)
                    printf("查找成功
",e);
                else{
                    printf("查找失败
");
                    break;
                }
                printf("查找元素的位置:%d
",LocateElem_Sq(&L, &e, &compare));
                putchar(
);
                break;
            case 5:printf("La:");
                for(i = 0; i < La.length; i++)
                    printf("%d ",La.elem[i]);
                putchar(
);
                printf("Lb:");
                for(i = 0; i < Lb.length; i++)
                    printf("%d ",Lb.elem[i]);
                putchar(
);
                MergeList_Sq(La, Lb, &Lc);
                printf("Lc:");
                for(i = 0; i < Lc.length; i++)
                    printf("%d ",Lc.elem[i]);
                putchar(
);
                break;
            case 6:printf("销毁顺序表...
");
                if(DestroyList(&L) == OK && DestroyList(&La) == OK && DestroyList(&Lb) == OK){
                    printf("销毁成功
");
                    break;
                }
                else{
                    printf("销毁失败
");
                    break;
                }
            default:printf("输入不合法请重新输入");
        }
        printf("请输入序号选择功能,退出请输入0
");
        fflush(stdin);//清空键盘缓冲区
        scanf("%d",&input);
        if(input == 0)
            break;
    }
}

Status CheckInit(int input){
    if(input == 1)
        return TRUE;
    else
        return FALSE;
}

Status CheckInput(int input,int flag){
    if(input <1 || input > MenuFun){
        printf("输入不合法,请重新输入
");
        return ERROR;
    }
    if(!flag){
        printf("未初始化
");
        return FALSE;
    }
    return TRUE;
}

 

测试过程:

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

以上是关于1.1线性表的顺序表示的主要内容,如果未能解决你的问题,请参考以下文章

线性表的顺序表示的简单实现(顺序表的实现)

C语言数据结构——线性表的顺序表示

数据结构算法C语言实现---2.3线性表的顺序表示和实现

Java数据结构(线性表)--线性表的顺序存储及其实现

数据结构—— 线性结构:线性表

数据结构实验:线性表的顺序表示和链式表示及插入、删除、查找运算