线性表的总结:顺序存储线性表的初始化,创建,插入,删除,清空,销毁等操作

      由于数据结构放置了很久,对一些基本的操作有些遗忘,于是近期重新开启了数据结构的学习模式。本文只要讲述了顺序存储线性表的一些基本操作,对于老鸟老说可能偏简单,但是对于新手或者很久没碰线性表的读者来说,还是比较有价值的,代码我都一一调试过。且必要的地方,我也做了详细的注释,这样也为自己后期学习做了一个remark。欢迎有兴趣的小伙伴跟我在站内交流互动,后期我会持续更新。

      这是我的学习代码:

#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"

#define MAXSIZE 20    //一般顺序线性表的最大长度是固定的
#define LIST_INI_LENGTH 5    //初始化时线性表的长度                    
#define OK 1
#define ERROR 0
#define TRUE 0
#define FALSE 0
typedef int Status;//函数的类型,其值是函数结果状态代码
typedef int ElemType;//定义线性表元素类型

typedef struct     //定义一个顺序存储结构类类型
{
    ElemType data[MAXSIZE];//线性表的数据元素
    int cur_length;//线性表的当前长度
}SqList;

Status ListInitial(SqList *L)//线性表的初始化
{
    L =(SqList*) malloc(MAXSIZE*sizeof(SqList));//为线性表分配内存,注:这里一定要强制类型转换
    if (L == NULL)
        printf("初始化失败!");
    L->cur_length = 0;//初始化时线性表分配的长度
    //for (int i = 0; i < LIST_INI_LENGTH;i++)
    //    L->data[i] = 0;
    return OK;

}

Status ListCreate(SqList *L)//线性表的创建,一般发生在初始化之后
{
    int i, n=0;
    printf("请在键盘输入即将创建的线性表长度:\n");
    scanf_s("%d", &n);//读者可以尝试把这条语句改成scanf_s("%d\n", &n),看运行结果
    L->cur_length = n;
    printf("请在键盘输入即将创建的线性表中的元素:\n");
    for (i = 0; i <n; i++)
    {
        scanf_s("%d", &L->data[i]);//注意小细节,读者可以把这条语句改成scanf_s("%d\n", &L->data[i]),然后分析运行结果
    }
        
    return OK;
}
Status ListClear(SqList *L)//线性表的清空
{
    int i;
    for (i = 0; i < L->cur_length; i++)
        L->data[i] = 0;
    L->cur_length = 0;
    return OK;
}

Status ListDestory(SqList L)//线性表的销毁
{
    free(L.data);
    return OK;
}
Status ListInsert(SqList *L, int i, ElemType e)//在L中的第i个位置之前插入新的数据元素e,L的长度加1
{
    int k;
    if (L->cur_length == MAXSIZE)//顺序表已满
        return ERROR;
    if (i<1 || i>L->cur_length)//当插入位置i不在线性表范围内时
        return ERROR;
    if (i < L->cur_length)//若插入数据的位置不在表尾
    {
        for (k = L->cur_length - 1; k >= i - 1; k--)
            L->data[k + 1] = L->data[k];
    }
    L->data[i - 1] = e;//将新元素插入
    L->cur_length++;//新元素插入后,线性表的长度加1
    return OK;
}

Status ListDelete(SqList *L, int i, ElemType *e)//删除线性表L的第i个元素,并用e返回其值,L的长度减1
{
    int k;
    if (L->cur_length == 0)
        return ERROR;
    if (i<1 || i>L->cur_length)//当删除位置i不在线性表范围内时
        return ERROR;
    *e = L->data[i - 1];
    if (i < L->cur_length)//若删除的数据的位置不在表尾
    {
        for (k = i; k<L->cur_length; k++)
            L->data[k-1] = L->data[k];
    }
    L->cur_length--;//删除元素后,线性表的长度减1
    return OK;
}

Status GetElem(SqList L, int i, ElemType *e)//获得第i个元素的操作
{
    if (L.cur_length == 0 || i<1 || i>L.cur_length)
        return ERROR;
    *e = L.data[i - 1];
    return OK;
}
int main()//主测试函数
{
    SqList L1 = {NULL};//还可以定义为*L1
    Status ListInitial(SqList &L1);//初始化线性表
    printf("初始化后线性表的长度为:");
    printf("%d\n", L1.cur_length);
    ListCreate(&L1);//创建线性表

    printf("当前线性表的长度为:");
    printf("%d\n", L1.cur_length);
    //SqList L2;
    ElemType f;
    ElemType a=1,b=2,e;
    ListInsert(&L1, 1, a); 
    ListInsert(&L1, 2, b);
    printf("插入元素后输出当前的线性表的实际长度为:");
    printf("%d\n", L1.cur_length);
    
    ListDelete(&L1, 2, &f);
    printf("输出被删除的元素:");
    printf("%d\n", f);
    
    printf("删除元素后线性表的实际长度为:");
    printf("%d\n", L1.cur_length);
    
    printf("输出线性表最后剩下的元素:\n");
    for (int j = 0; j < L1.cur_length; j++)
    {    
        
        printf("%d\n", L1.data[j]);
    }
    
    GetElem(L1, 2, &e);//获取线性表中的第二个元素
    printf("输出获取的第2个元素:");
    printf("%d\n", e);

    ListClear(&L1);//清空线性表,这个函数需要采用地址传递,而不能定义为Status ListClear(SqList L)
    printf("输出线性表此刻的长度:");
    printf("%d\n", L1.cur_length);

    return 0;
}

    下面是根据键盘提示输入数据后,我创建的顺序线性表的长度为5,下面代码的具体运行结果,代码的运行过程我再这里就不赘述了:

初始化后线性表的长度为:0
请在键盘输入即将创建的线性表长度:
5
请在键盘输入即将创建的线性表中的元素:
1
2
3
4
5
当前线性表的长度为:5
插入元素后输出当前的线性表的实际长度为:7
输出被删除的元素:2
删除元素后线性表的实际长度为:6
输出线性表最后剩下的元素:
1
1
2
3
4
5
输出获取的第2个元素:1
输出线性表此刻的长度:0
请按任意键继续. . .

  本文为作者原创,欢迎转载,转载请注明出处。

 

posted @ 2016-06-29 09:54  泰勒雨馨  阅读(2876)  评论(3编辑  收藏  举报