线性表1 顺序表的13个基本操作和应用实例

#include<stdio.h>
#include<stdlib.h>

//数据类型定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef struct{
    int * elem;
    int length;
    int listsize;
}SqList; 

//初始化一个新的线性表 1
void InitList(SqList * L){
    L -> elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    if(!(L -> elem))
        exit(0);
    L -> length = 0;
    L -> listsize = LIST_INIT_SIZE;
}

//销毁线性表  2
void DestroyList(SqList * L){
    free(L -> elem); 
    L -> elem = NULL;
    L -> length = 0;
    L -> listsize = 0;
}

//将线性表重置为空表 3
void ClearList(SqList * L){
    L -> length = 0;
}

//判空 4
bool ListEmpty(SqList List) {
    if (List.length == 0)
        return true;
    else
        return false;
}

//求表长 5 
int ListLength(SqList List){
    return List.length;

//获取第i个元素 6
bool GetElem(SqList List, int i, int * e){
    if(List.length == 0 || i < 1 || i > List.length)
        return false;
    * e = List.elem[i - 1];
    return true;
}

//赋值或者修改位序为i的值  7
bool PutElem(SqList * L, int i, int * e){  //i是位序,数组下标加1 
    if (i > L -> length + 1)
        return false;
    if (i < 1)
        return false;
    if (i < L -> length + 1)
        L -> elem[i - 1] = * e;
    if (i = L -> length + 1){
        if (L -> length == L -> listsize){
            int * newbase = (int *)realloc(L -> elem, (L -> listsize + LISTINCREMENT) * sizeof(int));
            if(!(L -> elem))
                exit(0);
            L -> elem = newbase;
            L -> listsize = L -> listsize + LISTINCREMENT;
            L -> elem[i - 1] = * e;
        }        
        else
            L -> elem[i - 1] = * e;
        L -> length = L -> length +1;
    }
    return true;
}

bool compare(int e, int f){
    if (e == f)
        return true;
    else
        return false;    

//求特定元素位序 8
int LocateElem(SqList List, int e, bool (*compare)(int, int)){
    if(List.length == 0)
        return -1;
    for (int i = 0; i < List.length; i++)
        if ((*compare)(List.elem[i], e))
            return i + 1;
    return 0;
}

//求前驱结点 9
bool PriorElem(SqList List, int cur_e, int * pre_e){
    if(List.length <= 1)
        return false;
    int i = LocateElem(List, cur_e, compare);
    if (i <= 1)
        return false;
    * pre_e = List.elem[i - 2];
    return true;
}

//求后继结点 10
bool NextElem(SqList List, int cur_e, int * next_e){
    if(List.length <= 1)
        return false;
    int i = LocateElem(List, cur_e, compare);
    if (i == List.length || i < 1)
        return false;
    * next_e = List.elem[i];
    return true;
}

bool visit(int * x){
    printf("%d\n", * x);
    return true;
}

//遍历线性表 11
bool ListTraverse(SqList List, bool (*visit)(int * x)){  //函数做参数 
    bool flag;
    if(List.length == 0)
        return false;
    for (int i = 0; i < List.length; i++){
        flag = (*visit)(& List.elem[i]);
        if (flag == false)
            break;
    }
    return flag;

//在第i个元素前插入元素 12
bool ListInsert(SqList * L, int i, int e){
    if (i < 1 || i > L -> length + 1)
        return false;
    if (L -> length == L -> listsize){
        int * newbase = (int *)realloc(L -> elem, (L -> listsize + LISTINCREMENT) * sizeof(int));
        if(!(L -> elem))
            exit(0);
        L -> elem = newbase;
        L -> listsize = L -> listsize + LISTINCREMENT;
    }    
    for (int j = L -> length - 1; j >= i - 1; j--)
        L -> elem[j + 1] = L -> elem[j];
    L -> elem[i - 1] = e;
    L -> length = L -> length + 1;
    return true;
}

//删除第i个元素 13
bool ListDelete(SqList * L, int i, int * e){
    if (i < 1 || i > L -> length)
        return false;
    * e = L -> elem[i - 1];
    for (int j = i - 1; j <= L -> length - 2; j++)
        L -> elem[j] = L -> elem[j + 1];
    L -> length = L -> length - 1;
    return true;
}

//示例一 合并两个线性表
void Union(SqList * La, SqList Lb){
    int a;
    for (int i = 0; i < Lb.length; i++){
        a = LocateElem(* La, Lb.elem[i], compare);
        if (a == 0)
            ListInsert(La, La -> length + 1, Lb.elem[i]);
    }
}

//示例二 有序表合并
void MergeList(SqList La, SqList Lb, SqList * Lc){
    int i = 0, j = 0, k = 0;
    
    while(i < La.length && j < Lb.length){
        if(La.elem[i] < Lb.elem[j]){
            ListInsert(Lc, k+1, La.elem[i]);
            i++;
            k++;
        }
        else{
            ListInsert(Lc, k+1, Lb.elem[j]);
            j++;
            k++;
        }    
    }
    while(i < La.length){
        ListInsert(Lc, k+1, La.elem[i]);
        i++;
        k++;
    }
    while(j < Lb.length){
        ListInsert(Lc, k+1, Lb.elem[j]);
        j++;
        k++;
    }
}

int main(){
    SqList La, Lb, Lc;
    SqList *PLa = &La;
    SqList *PLb = &Lb;
    SqList *PLc = &Lc;
    InitList(PLa);
    InitList(PLb);
    InitList(PLc);
    ListInsert(PLa, 1, 11);
    ListInsert(PLa, 2, 33);
    ListInsert(PLb, 1, 22);
    ListInsert(PLb, 2, 33);
    //ListInsert(PLb, 3, 44);
    //Union(PLa,Lb);
    ListTraverse(La,visit);
    MergeList(La, Lb, PLc);
    ListTraverse(Lc,visit);
    
    return 0;
}

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知足常乐2504

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值