线性表

发布时间 2023-05-28 17:56:37作者: 风中凌乱的猪头

1、线性表:最常用最简单的数据结构,是一个n个数据元素的有限序列。

2、理解重点:顺序存储,任意存取

3、实现线性表前的一些宏定义以及typedef

 1 #define LIST_INIT_SIZE 100//存储空间初始分配量
 2 #define LISTINCREMENT 10//存储空间的分配增量
 3 
 4 #define ERROR 0
 5 #define OK 1
 6 #define TURE 1
 7 #define FALSE 0
 8 
 9 typedef int  ElemType;
10 typedef int Status;

线性表的存储结构

1 typedef struct{
2     ElemType *elem; //存储空间基址
3     int length;//当前长度
4     int listsize;//当前分配的长度
5 }SqList;

4、部分算法。

  1、初始化空表

Status InitList_Sq(SqList *L){
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L->elem)
    {
        exit(1);//这里存储空间分配失败怎么写??异常退出
    }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    return OK;
}

  2、输出线性表

void Output_L(SqList *L)
{
    for(int i = 0;i<L->length;i++)
    {
        printf("%d ",L->elem[i]);
    }
    printf("\n");
}

  3、插入数,参数有插入位置和插入的数(书上的是插入的数的地址)

Status ListInsert_Sq(SqList *L,int i,int e){
    int *newbase;
    int *q;
    int *p;
    if(i < 1  || i > L->length)
    {
        return ERROR;
    }
    if(L->length >= L->listsize)
    {
        newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)
        {
           exit(1);
        }
        L->elem = newbase;
        L->listsize += LISTINCREMENT;
    }
    q  = &(L->elem[i-1]);
    for(p = &(L->elem[L->length-1]);p >= q; --p)
    {
        *(p+1) = *p;
    }
    *q = e;
    L->length++;
    return OK;
}

  4、删除线性表的一个数,参数给定位置,保存删除的值

Status ListDelete_Sq(SqList *L,int i,ElemType *e)
{
    int *p;
    int *q;
    if(i < 1  || i > L->length)
    {
        return ERROR;
    }
    p = &(L->elem[i-1]);
    *e = *p;
    q = L->elem+L->length-1;//表尾元素位置 //elem其实是数组的名字,数组首地址
    for(++p;p<=q;++p){
        *(p-1) = *p;
    }
    L->length--;
    return OK;
}

  5、查找值,给定值,如果线性表中有就返回位置,如果线性表中没有,就返回0

int LocateElem(SqList *L,ElemType *e)
{
    ElemType *p;
    p = L->elem;
    int i = 1;
    while(i <= L->length){
        if(*e == *p)
        {
            break;
        }
        i++;
        p++;
    }
   // printf("%d\n",i);
    if(i <= L->length)
    {
        return i;
    }
    else{
        return 0;
    }
}

  6、对应主函数

int main()
{
    int j;
    int a=0;
    int *e = (int *)malloc(sizeof(int));
    SqList *L1 = (SqList *)malloc(sizeof(SqList));
    //SqList L1[1];
    InitList_Sq(L1);
    L1->length = 10;
    for(j = 0; j<L1->length; j++)
    {
        L1->elem[j] = j;
    }
    Output_L(L1);

    ElemType LI1 = 8;
    ListInsert_Sq(L1,5,LI1);
    Output_L(L1);

    ListDelete_Sq(L1,5,e);
    Output_L(L1);
    printf("%d\n",*e);
    
    *e =4;
    a= LocateElem(L1,e);
    printf("%d\n",a);
    free(L1->elem);
    free(L1);
    free(e);
    return 0;
}

7、还有两个线性表的操作,后期可能会补。