线性表

(看的是严蔚敏清华大学的数据结构(C语言版))

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、初始化空表

1
2
3
4
5
6
7
8
9
10
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、la lb非递减传递给Lc非递减

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/La,Lb非递减给Lc
void MergeList(SqList La,SqList Lb,SqList *Lc){
    ElemType *pa;
    ElemType *pb;
    ElemType *pc;
    int *pa_last;
    int *pb_last;
    pa = La.elem;
    pb = Lb.elem;
    Lc->listsize = Lc->length = La.length + Lb.length;
    pc = Lc->elem = (ElemType *)malloc(Lc->listsize*sizeof(ElemType));
    if(!Lc->elem)
    {
        exit(3);
    }
    pa_last = La.elem+La.length-1;
    pb_last = Lb.elem+Lb.length-1;
 
    while(pa<=pa_last&&pb<=pb_last)
    {
        if(*pa<=*pb)
        {
            *pc++ = *pa++;
        }
        else
        {
            *pc++ = *pb++;
        }
    }
    while(pa<=pa_last)
    {
        *pc++ = *pa++;
    }
    while(pb<pb_last)
    {
        *pc++ = *pb++;
    }
 
}

  

 

posted @   风中凌乱的猪头  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示