【数据结构】顺序线性表的实现与基本操作

自打在知乎上看到思否这个平台后,就总想写点什么;也想与更多的人交流,学一点东西。
学校数据结构授课用的教材是严蔚敏老师的《数据结构(C语言版)》,教材将介于伪码和C语言之间的类C语言作为描述工具讲解算法,在实际学习中,还是需要我们把代码转换成C语言程序,编译通过。这个过程才能帮助更好地理解算法。
我开通博客的目的也在于此,将自己复现的代码和完成的课后习题记录下来,与大家分享交流;偶尔也分享一些自己对一些开源项目的学习理解。
第一次的内容非常简单,顺序表的基本操作。主要包括了:

  1. 构建空表
  2. 插入元素
  3. 删除元素
  4. 查找元素

功能简单,编译时遇到的困难也较少。

#include
#include
#include "malloc.h" 

#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE   -1
#define OVERFLOW     -2
#define LIST_INIT_SIZE   100
#define LISTINCREMENT    10

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

Status InitList_Sq(SqList &L){
    //构造空表
    L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    if(!L.elem)exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK; 
}
Status ListInsert_Sq(SqList &L,int i){
    //在顺序表的第i个位置插入键盘输入的数 
    int* p,* q,e;
    if(i < 1 || i > L.length + 1)return ERROR;
    if(L.length >= L.listsize){
        int* newbase = (int*)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(int));
        if(!newbase)exit(OVERFLOW);
        L.elem = newbase;
        L.listsize += LISTINCREMENT;
    }
    q = &(L.elem[i-1]);
    for(p = &(L.elem[L.length-1]);p >= q;--p) *(p+1) = *p;
    scanf("%d",&e); //键盘输入值赋给e
    *q = e;
    ++ L.length;
    return OK; 
}
Status List_Print(SqList L){
    //打印顺序表中的数
    for(int r = 0;r < L.length;r++)printf("%d ",L.elem[r]);
    printf("\n");
}
Status List_Search(SqList L){
    //查找顺序表
    int i; 
    scanf("%d",&i); 
    if(i < 1 || i > L.length + 1)return ERROR;
    printf("您查找的数是:%d \n",L.elem[i-1]);
}
Status ListDelete_Sq(SqList &L){
    //删除指定的数,并用e返回 
    int* p,* q;
    int i,e; 
    scanf("%d",&i);
    if(i < 1 || i > L.length + 1)return ERROR;
    p = &(L.elem[i-1]);
    e = *p;
    q = L.elem + L.length - 1;
    for(++p;p <= q;++p)*(p-1) = *p;
    --L.length;
    printf("%d被删除了\n",e);
    return OK;
}
int main()
{
    SqList L;
    InitList_Sq(L);
    printf("请为顺序表输入4个整数:\n");
    for(int a = 1;a <= 4;a++)ListInsert_Sq(L,a);
    printf("现有的顺序表为:\n");
    List_Print(L);
    printf("请输入要查找的位置\n");
    List_Search(L);
    printf("请输入插入的位置和数(用换行分开):\n");
    int a;
    scanf("%d",&a);
    ListInsert_Sq(L,a);
    printf("现有的顺序表为:\n");
    List_Print(L);
    printf("请输入要删除的位置\n");
    ListDelete_Sq(L);
    printf("现有的顺序表为:\n");
    List_Print(L);
    return 0;} 

所用的编译器是dev c++.

你可能感兴趣的