线性表的三种基本操作_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。

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

原文地址:https://www.cnblogs.com/zx-zhang/p/7536597.html