#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef int Status;
#define LIST_INIT_SIZE 100
#define INCREMENT 10
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
Status InitSqList(Sqlist *List){
(*List).elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if(!(*List).elem){
return OVERFLOW;
}
(*List).length=0;
(*List).listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(Sqlist *List,int i,ElemType e){
if(i<1||i>(*List).length+1){
return ERROR;
}
if((*List).length>=(*List).listsize){
ElemType* newBase=(ElemType *)realloc((*List).elem, ((*List).listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newBase){
return OVERFLOW;
}
(*List).elem=newBase;
(*List).listsize+=LISTINCREMENT;
}
ElemType *q,*p;
q=&(List->elem[i-1]);
p=&(List->elem[List->length-1]);
for(;p>=q;p--){
*(p+1)=(*p);
}
*q=e;
List->length++;
return OK;
}
Status ListDelete_Sq(Sqlist *List,int i,ElemType *e){
if(i<1||i>List->length){
return ERROR;
}
ElemType *p=&(List->elem[i-1]);
e=p;
ElemType *q=List->elem+List->length-1;
while (p<=q) {
*(p)=*(p+1);
p++;
}
List->length--;
return OK;
}
void Print_Sq(Sqlist List){
ElemType *p,*q;
p=List.elem;
q=List.elem+List.length-1;
while (p<=q) {
printf("%d\n",*p);
p++;
}
}
Status Union(Sqlist La,Sqlist Lb,Sqlist *Lc){
Lc->elem=(ElemType *)malloc(sizeof(ElemType)*(La.length+Lb.length));
if(!Lc->elem){
exit(OVERFLOW);
}
Lc->listsize=La.length+Lb.length;
ElemType *pa,*pb,*pc;
pa=La.elem; pb=Lb.elem; pc=Lc->elem;
ElemType *pa_last=La.elem+La.length-1;
ElemType *pb_last=Lb.elem+Lb.length-1;
while (pa<=pa_last&&pb<=pb_last) {
if(*pa<=*pb){
*pc=*pa;
pc++;
pa++;
}else{
*pc=*pb;
pc++;
pb++;
}
Lc->length++;
}
while (pa<=pa_last) {
*pc++=*pa++;
Lc->length++;
}
while (pb<=pb_last) {
*pc++=*pb++;
Lc->length++;
}
return OK;
}
int main() {
Sqlist La;
Sqlist Lb;
Sqlist Lc;
InitSqList(&La);
InitSqList(&Lb);
for(int i=0;i<10;i++){
ListInsert_Sq(&La, (i+1), i);
ListInsert_Sq(&Lb, (i+1), i+3);
}
Print_Sq(La);
Print_Sq(Lb);
ElemType *e = NULL;
ListDelete_Sq(&La, 3, e);
printf("%d",*e);
Print_Sq(La);
Union(La, Lb, &Lc);
Print_Sq(Lc);
return 0;
}
要点
- 插入和删除操作都要求提供元素所在位置,即每次都要判断所提供的位置是否合法
- 插入:1<=i<=List.length+1;插入可以插入到最后一个位置,即List.elem[length]
- 删除: 1<=i<List.length;
- 每次需要分配内存空间时,都要判断是否分配成功
- 插入时,要判断当前线性表的长度是否超过了当前分配的存储容量,即判断是否有List.length>=List.listsize;如果出现,则需要重新分配内存
- 无论是插入还是删除,都要找到线性表中最后一个元素的位置,因为需要移动位置。