zoukankan      html  css  js  c++  java
  • 线性表的三种基本操作_1

    线性表顺序结构下的建立、插入、删除操作<#C>

    #include <stdio.h>
    #include <stdlib.h>

    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    //#define Status int

    typedef int Status ;    //与前面一句的作用相同,都是定义一个状态
    #define OK           1
    #define TRUE         1
    #define FALSE     0
    #define ERROR        0
    #define OVERFLOW     -2


    typedef struct{
     Status *elem;     //线性表的基址
     int length;         //当前的长度
     int listsize;     //线性表的存储容量
    }SqList;

    int  InitList_Sq(SqList &L);
    int ListInSert_Sq(SqList &L,int i,Status e);
    int ListDelete_Sq(SqList &L,int i,Status &e);

    int   main(){
     int i;
     SqList L;
     InitList_Sq (L);
     //input the data into the Sqlist by insert operation
     for(i=1;i<20;i++)
     {
      ListInSert_Sq(L,i,i*2);
     }
    //output the Sqlist
    printf("The original sqlist is: ");
     for(i = 0;i < L.length ; i++)
     {
      printf("%d ", L.elem[i]);
     }
     printf(" ");

    //insert a data into the SqList
     ListInSert_Sq(L,3,5);
     printf("After insert: ");
     for( i = 0;i < L.length ;i++)
     {
      printf("%d  ",L.elem[i]);
     }
     printf(" ");
     
     //delete a data from the SqList
       Status e;
       ListDelete_Sq(L,4,e);
     printf("delete the num: %d ",e);
     printf("After delete: ");
     for(i=0;i<L.length;i++)
     {
      printf("%d ",L.elem[i]);
     }
     printf(" ");
     return OK;
    }


    //线性表的建立
    int InitList_Sq(SqList &L){
     L.elem = (Status*)malloc(LIST_INIT_SIZE * sizeof(Status)); 
     if( !L.elem)
     {
      exit(OVERFLOW);
     }
     L.length  = 0;
     L.listsize = LIST_INIT_SIZE;
     return OK;
    }
    //线性表的插入
    int ListInSert_Sq(SqList &L,int i,Status e){
     if(i<1 || i > L.length+1)
     {
      return ERROR;
     }
     if(L.length >= L.listsize)
     {
      Status *newbase = (Status *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof (Status));   //建立新的空间
      if(!newbase)
      {
       exit(OVERFLOW);
      }
      L.elem = newbase;
      L.listsize += LISTINCREMENT;
     }
     
     Status *p,*q;
      q = &(L.elem[i-1]);
     for(p = &(L.elem[L.length-1]); p >= q; --p)
     { 
      *(p + 1) = *p;
     }
         *q = e;
      ++L.length;
     return OK;
    }

    //线性表的删除
    int ListDelete_Sq(SqList &L,int i,Status &e)
    {
     if(i < 1 ||i > L.length) 
     {
      return ERROR;
     }
     int *p,*q;   //Status *p,*q;
     p = &(L.elem[i-1]);
     e = *p;
     q = L.elem + L.length - 1;
     for(++p; p <= q; ++p)
     {
      *(p-1) = *p;
     }
     --L.length;
     return OK;
    }

    后续考虑:是否可以将插入元素的函数改成删除元素的函数那样,以实现用户可以手动输入要插入的元素值,即 定义为 Status *e;

    实践后发现,若将插入函数改成这样,则之后无法进行线性表的初始化操作,需另外编写输入线性表的函数input。

    所以说这么写有一定的合理性。

  • 相关阅读:
    团队项目-需求分析报告
    自动化测试框架指南
    一起吐槽接口文档
    居家费拖鞋【FunTester居家日记】
    HTTP接口测试基础【FunTester框架教程】
    Java NIO在接口自动化中应用
    JAVA 可变参数
    HashSet 和 LinkedSet 数据结构
    简单数据结构
    JAVA 迭代器的简单使用
  • 原文地址:https://www.cnblogs.com/zx-zhang/p/7536597.html
Copyright © 2011-2022 走看看