C语言数据结构(1)--线性表

线性表

一 准备工作

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 // list的初始大小
#define LISTINCREMENT 10 //每次扩容增加的内存大小
#define ElemType int 
#define Status int
#define OK 1
#define ERROR 0
typedef struct
{
    ElemType * elem; // elem
    int length;
    int listsize;
}SqList; // 定义一个名为Sqlist的结构体,这就时我们的表

二 对于线性表的基本操作

1 初始化

Status InitList_Sq(SqList &L)
{
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem) exit(OVERFLOW);//如果无法分配内存,退出
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}

2 摧毁列表

void DestoryList(SqList &L)
{
    free(&L);
}

3 清空列表

清空列表不意味着释放内存,在C++的vector数据类型的clear()也是这样

void ClearList(SqList &L)
{
    L.length=0;
    //make the length of L zero
}

4 判断表是否为空

若空,返回true,非空,返回false

bool List_Empty(SqList L)
{
    if(L.length) return false;
    return true;
}

5 获取表的长度

int List_Length(SqList L)
{
    return L.length;
}

6 用e返回第i个元素的值

int GetElem(SqList L,int i,int &e)
{
    if(i>=1&&i<=L.length)
    {
        e=L.elem[i-1];
        return true;
    }
    return false;
}

7 定位元素位置

我们可以自定义Compare()函数得到第一个满足条件的函数的位置

int LocateElem(SqList L,int e,bool Compare(int x,int y))
{
    for (int i=1; i<=L.length; i++)
    {
        if(Compare(e,L.elem[i-1]))
            return i;
    }
    return 0;
}

8 获取下一个元素的位置

int PriorElem(SqList L,int cur_e,int &pre_e)
{
    for (int i=1; i<=L.length; i++)
    {
        if(L.elem[i-1]==cur_e)
        {
            if(i==1) return 0;
            pre_e=L.elem[i-2];
            return 1;
        }
    }
    return 0;
}

9 插入元素

int List_Insert_Sq(SqList &L,int i,int e)
{
    if(i<1||i>L.length+1) return ERROR;
    if(L.length>=L.listsize)
    {
        int* newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT) * sizeof(ElemType));//重新分配内存
        if(!newbase) exit(OVERFLOW);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;//增加表的容量
    }
    //开始进行表内元素的移动
    int *q = &(L.elem[i-1]);
    for (int *p=&(L.elem[L.length-1]); p>=q; p--)
    {
        *(p+1)=*p;
    }
    *q=e;
    L.length++;
    return OK;
}

10 向列表尾部加入元素

int List_push_back(SqList &L,int e)
{
    // 如果内存不足,重新分配
    if(L.length==L.listsize)
    {
        int *newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT) * sizeof(ElemType));
        if(!newbase) exit(OVERFLOW);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    L.elem[L.length]=e;
    L.length++;
    return OK;
}

11 弹出最后的元素

并用e返回这个元素

int List_pop(SqList &L,int e)
{
    if(!L.length) return ERROR;
    e=L.elem[L.length-1];
    L.length--;
    return OK;
}

12 删除元素

int List_Delete_Sq(SqList &L,int i,int &e)
{
    if(i<1||i>L.length) return ERROR;
    int *p=&L.elem[i-1];
    e=L.elem[i-1];
    for (int *q=&L.elem[L.length-1]; p<q; p++)
    {
        *p=*(p+1);
    }
    //删除之后后面的元素对前面进行补位
    L.elem[L.length-1]=0;
    L.length--;
    return OK;
}

13 对表内元素进行排序

在这里我们使用快排
排序算法出门右转

void List_sort(SqList &L,int start,int end ,bool Compare(int x,int y))
{
    int mid=L.elem[(start+end)/2];
    int i=start;
    int j=end;
    while (i<=j)
    {
        while(Compare(L.elem[i],mid)) i++;
        while(Compare(mid,L.elem[j])) j--;
        if(i<=j)
        {
            int temp=L.elem[i];
            L.elem[i]=L.elem[j];
            L.elem[j]=temp;
            i++;
            j--;
        }
        if(i<end) List_sort(L, i, end, Compare);
        if(j>start) List_sort(L, start, j, Compare);
    }
}

三 验证我们的表

bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    SqList List;
    InitList_Sq(List);
    for(int i=1;i<=10;i++)
    List_push_back(List, i);
    printf("%d\n",*(List.elem));
    List_Insert_Sq(List, 2, 6);
    printf("%d\n",*(List.elem+1));//search for the second elem
    int second;
    List_Delete_Sq(List, 2, second);
    printf("%d\n",*(List.elem+1));
    List_sort(List, 0, List.length-1, cmp);
    printf("%d\n",List.elem[1]);
}

结果如下
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值