• 线性表以顺序表为存储结构的实现(数据元素的类型为整型)


    • 前记:

           现在我在学习数据结构与算法,所以计划记录下学习中的心得,以便以后回忆,博客是一个不错的平台,方便学习。

    • 问题描述:

           设某线性表数据元素的类型为整型,以顺序表为存储结构,编程实现。

    • 数据类型定义:

        (一)、数据结构:用顺序结构保存线性表,建立结构,带头结点,

       /*-------定义线性表的元素类型,此处为整形-------------------- */

       typedef int Elemtype;

       /*-------------- 线性表的动态分配顺序存储结构-------------------*/

       typedef struct {

             Elemtype *elem; /* 存储空间的首地址 */

             int length; /* 当前长度 */

             int listsize; /* 当前分配的存储空间 */

      }SqList;

    #define LIST_INIT_SIZE 100  //线性表存储空间的初始分配量
    #define LISTINCREMENT  10   // 线性表存储空间的分配增量

    //状态结果的代码
    #define TRUE  1
    #define FALSE 0
    #define OK    1
    #define ERROR 0
    #define OVERFLOW –1

    • 函数原型:

    //-----------基本的操作---------------------------------
    //构造一个空的线性表
    int InitList(SqList *L);
    //销毁线性表L,L已经存在
    int DestroyList(SqList *L);
    //将表L置空,线性表L已经存在
    int ClearList(SqList *L);
    //判断L是否为空,空返回true,否则false,L已经存在
    int ListEmpty(SqList L);
    //返回L中元素的个数,L已经存在
    int ListLength(SqList L);
    //用e返回L中的第i个元素的值,成果返回true.1<=i<=Lenth
    int GetElem(SqList L, int i, Elemtype *e);
    //返回L中第一个与e满足关系compare()的数据的位(1,2,...),
    //不成功返回0, L已经存在,compare()为判定函数
    int LocateElem(SqList L,Elemtype e,int (*compare)(void *, void *));
    //若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的
    //前驱,否则返回失败,pre_e无定义,L存在
    int PriorElem(SqList L, Elemtype cur_e, Elemtype *pre_e);
    //若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的
    //后继,否则返回失败,next_e无定义,L存在
    int NextElem(SqList L, Elemtype cur_e, Elemtype *next_e);
    //在L的第i个位置插入新的元素e,L的长度加一,L已经存在
    //1<=i<=listlength+1,成功返回ture
    int ListInsert(SqList *L, int i, Elemtype e);
    //删除L的第i个元素,用e保存,L长度减一
    //线性表L已经存在非空,1<=i<=listlength
    int ListDelete(SqList *L, int i, Elemtype *e);
    //依次对L调用函数visit(),失败就操作失败,L已经存在
    int ListTraverse(SqList L, int (* visit)(void *));
    //显示线性表中的所有元素
    int ListPrint(SqList L);
    //保存线性表到文件
    int ListSave(SqList L);
    //导入线性表文件
    int ListLoad(SqList *L);
     

    源代码:

    1. //构造一个空的线性表
      int InitList(SqList *L)
      {
        L->elem = (Elemtype *)malloc(LIST_INIT_SIZE * sizeof(Elemtype));
        if (!L->elem) exit(ERROR); //存储分配失败
        L->length = 0;       //设置长度
        L->listsize = LIST_INIT_SIZE; //设置已经分配的空间
        return OK;         // 成功时返回OK   
      }
    2. //销毁线性表L,L已经存在,存储空间释放掉
      int DestroyList(SqList *L)
      {
        if (!L->elem) //已经销毁
          return ERROR;
        free(L->elem);
        L->elem = NULL; /* 表置空*/
        return OK;
      }
    3. //将表L置空,线性表L已经存在,长度置零
      int ClearList(SqList *L)
      {
        if (!L->elem)  //L不存在
          return ERROR;
        L->length = 0;
        return OK;
      }
    4. //判断L是否为空,空返回true,否则false,L已经存在
      int ListEmpty(SqList L)
      {
        if (L.length < 0 || L.length > L.listsize || !L.elem)
          return ERROR;
        if (L.length == 0)
          return TRUE;
        return FALSE;
      }
    5. //返回L中元素的个数,L已经存在
      int ListLength(SqList L)
      {
        if (L.length < 0 || L.length > L.listsize || !L.elem)
          return ERROR;
        return L.length;
      }
    6. //用e返回L中的第i个元素的值,成果返回true. 1<=i<=Lenth
      int GetElem(SqList L, int i, Elemtype *e)
      {
        if (i < 1 || i > L.length || !L.elem)
          return FALSE;
        *e = (int )L.elem[i-1]; /* 与Elemtype 相关*/
        return TRUE;
      }
    7. //返回L中第一个与e满足关系compare()的数据的位(1,2,...),
      //不成功返回0, L已经存在,compare()为判定函数
      int LocateElem(SqList L,Elemtype e,int (*compare)(void *, void *))
      {
        int i;
        if (!L.elem) return ERROR;
        for (i = 0; i < L.length; i++) {
          if (compare((int *)e, (int *)L.elem[i]) == TRUE) /* 与Elemtype 相关*/
            return i+1;
        }
        return 0;
      }
    8. //若cur_e是L的数据元素,且不是第一个,则用pre_e返回他的
      //前驱,否则返回失败,pre_e无定义,L存在
      int PriorElem(SqList L, Elemtype cur_e, Elemtype *pre_e)
      {
        int i;
        for (i = 1; i < L.listsize; i++) {
          if (L.elem[i] == cur_e) {
            *pre_e = (int )L.elem[i-1]; /* 与Elemtype 相关*/
            return OK;
          }
        }
        return FALSE;
      }
    9. //若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的
      //后继,否则返回失败,next_e无定义,L存在
      int NextElem(SqList L, Elemtype cur_e, Elemtype *next_e)
      {
        int i;
        for (i=0; i < L.listsize - 1; i++) {
          if (L.elem[i] == cur_e) {
            *next_e = (int )L.elem[i+1];  /* 与Elemtype 相关*/
            return OK;
          }
        }
        return FALSE;
      }
    10. //在L的第i个位置插入新的元素e,L的长度加一,L已经存在
      //1<=i<=listlength+1,成功返回ture
      int ListInsert(SqList *L, int i, Elemtype e)
      {
        if (!L->elem) return ERROR;
        Elemtype *newbase, *target, *p;
        if (i < 1 || i > L->length + 1) return ERROR;
        if (L->length >= L->listsize) {
          newbase = (Elemtype *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Elemtype));
          if (!newbase) exit(-1);
          L->elem = newbase;
          L->listsize += LISTINCREMENT;
        }
        target = &(L->elem[i-1]); //target 为插入的地址
        for (p = &(L->elem[L->length-1]); p >= target; p--)
          *(p+1) = *p;
      
        *target = e;
        ++L->length;
        return OK;
      }
    11. //删除L的第i个元素,用e保存,L长度减一
      //线性表L已经存在非空,1<=i<=listlength
      int ListDelete(SqList *L, int i, Elemtype *e)
      {
        Elemtype *tail, *p;
        if (i < 1 || i > L->length || !L->elem) return ERROR;
        p = &(L->elem[i-1]);
        e = p;
        tail = &(L->elem[L->length-1]);
        for (p++; p <= tail; ++p)
          *(p-1) = *p;
        --L->length;
        return OK;
      }
    12. //依次对L调用函数visit(),失败就操作失败,L已经存在
      int ListTraverse(SqList L, int (* visit)(void *))
      {
        int i;
        for (i = 0; i < L.length; i++)
          //如果失败
          if (!visit((int *)L.elem[i]))/* 与Elemtype 相关*/
            return ERROR;
        return TRUE;
      }
    13. //显示线性表中的所有元素
      int ListPrint(SqList L)
      {
        int i;
        if (!L.elem || L.length < 1 || L.length > L.listsize){
          printf("empty!\n");
          return ERROR;
        }
        for (i = 0; i < L.length; i++) {
          printf("%d ", L.elem[i]);
        }
        printf("\n");
        return TRUE;
      }
    14. //保存线性表元素                                                                                                                                                  
         int ListSave(SqList L) {
        char fileName[FILENAME_MAX];
        int i;
        FILE *fout;
        printf("input the file(输入文件名):\n");
        scanf("%s", fileName);
        if ((fout = fopen(fileName, "w+")) == NULL) {
            printf("error!\n");
            return ERROR;
        }
        fprintf(fout, "%d %d\n", L.length, L.listsize);
        for (i=0; i < ListLength(L); i++){
          fprintf(fout, "%d\t", L.elem[i]);
        }
        fclose(fout);
        return OK;
      }
    15. //导入文件信息
      int ListLoad(SqList *L)
      {
        char fileName[FILENAME_MAX];
        int i;
        FILE *fin;
        printf("input the file(输入文件名):\n");
        scanf("%s", fileName);
        if ((fin = fopen(fileName, "r+")) == NULL) {
            printf("error!\n");
            return ERROR;
        }
        fscanf(fin, "%d %d\n", &L->length, &L->listsize);
        for (i=0; i < L->length; i++){
          fscanf(fin, "%d\t", &L->elem[i]);
        }
        fclose(fin);
        return OK;
      }
    16. //界面函数void printMain(void){
        system("cls");
        printf("--------------欢迎来到线性表操作界面--------------------\n");
        printf("                                    ----design by lijian\n");
        printf("\n\
                 (1) 导入文件构造一个空线性表\n\
                 (2) 销毁线性表\n\
                 (3) 线性表置空\n\
                 (4) 判断是否为空\n\
                 (5) 求线性表长度\n\
                 (6) 返回线性表的某元素的值\n\
                 (7) 返回线性表中第一个给定元素满足关系compare()\n\
                 (8) 返回它的前驱\n\
                 (9) 返回他的后继\n\
                 (10) 数据元素的插入操作\n\
                 (11) 数据元素的删除操作\n\
                 (12) 依次对线性表调用函数visit()\n\
                 (13) 显示线性表中的全部元素\n\
                 (14) 保存线性表到文件\n\
                 (0 ) 退出\n");
        printf("输入你的选择(0-14):\n");
        return ;
      }

    17. //主函数int main(void)
      {
        SqList L;
        int choose = -1;
        Elemtype element, searchElem;
        int num;
        system("color 0a"); /* 设置界面颜色 */
        InitList(&L);
        do {
          printMain();
          scanf("%d", &choose);
          fflush(stdin); //刷新输入流
          switch (choose) {
            case 0: printf("hope you enjoy this journey!\n"); break;
            case 1: if (ListLoad(&L)) printf("success to load\n");
                    else printf("error!\n");
                    system("pause"); break;
            case 2: if (DestroyList(&L)) printf("success to destroy\n");
                    system("pause"); break;
            case 3: if (ClearList(&L)) printf("success to clear\n");
                    system("pause"); break;
            case 4: if (ListEmpty(L)) printf(" empty\n");
                    else printf("not empty!\n");
                    system("pause"); break;
            case 5: printf ("the length is %d\n", ListLength(L));
                    system("pause"); break;
            case 6: printf("输入元素位置,(1-%d):\n", ListLength(L));
                    scanf("%d", &num);
                    if (GetElem(L, num, (int *)&element))
                      printf("元素是 %d\n", element);
                    else printf("错误!\n");
                    system("pause");
                    break;
            case 7: /* 进行一些函数调用 */
                  /*LocateElem(L, element, compare);*/
                  break;
            case 8:
                  printf("输入元素对象:\n");
                  scanf("%d", &searchElem);
                  if (PriorElem(L, searchElem, (int *) &element))
                    printf("它的前一个元素是 %d\n", element);
                  else printf("没有!\n");
                  system("pause");
                  break;
            case 9:
                  printf("输入元素对象:\n");
                  scanf("%d", &searchElem);
                  if (NextElem(L, searchElem, (int *)&element))
                    printf("它的后一个元素是 %d\n", element);
                  else printf("没有!\n");
                  system("pause"); break;
            case 10:
                  printf("输入插入元素的位置,(1-%d):\n", 1 + ListLength(L));
                  scanf("%d", &num);
                  printf("输入元素:\n");
                  scanf("%d", &element);
                  if (ListInsert(&L, num, element)) printf("success to insert\n");
                  else printf("fail to insert!\n");
                  system("pause"); break;
            case 11:
                  printf("输入要删除元素的位置,(1-%d):\n", ListLength(L));
                  scanf("%d", &num);
                  if (ListDelete(&L, num, (int *)&element)) printf("succes to delete\n");
                  else printf("fail to delete\n");
                  system("pause"); break;
            case 12: /* 对每个元素调用一次函数 */
                  /* ListTraverse(L, visit); */
                  system("pause"); break;
            case 13:
                  ListPrint(L);
                  system("pause"); break;
            case 14:
                  if (ListSave(L)) printf("success to save!\n");
                  else printf("error!\n");
                  system("pause"); break;
            default: system("pause"); break;
          }
        }while (choose != 0);

        system("pause");
        return 0;
      }

    18. 实现效果:

    界面:

     image 

    导入:

     image

    显示:

     image

  • 相关阅读:
    HDOJ2010_水仙花数
    npm报错:无法加载文件 D: odejs ode_globalwebpack.ps1,因为在此系统上禁止运行脚本
    百度全景地图使用时提示flash版本过低 如何处理?
    寂静之声 的歌词的中文意思
    国产电脑操作系统有哪些?
    解决mac系统中npm全局安装提示没有权限的问题
    nodemon运行 提示错误:无法加载文件 C:UsersgxfAppDataRoaming pm odemon.ps1。
    git设置忽略文件及目录
    Element中的Cascader 级联选择器高度不能正常显示如何解决2
    wepy内网环境下进行项目初始化异常处理(Failed to download repo standard: read ECONNRESET)
  • 原文地址:https://www.cnblogs.com/hustlijian/p/2053409.html
  • Copyright © 2020-2023  润新知