线性表顺序结构下的建立、插入、删除操作<#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。
所以说这么写有一定的合理性。