#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가 있는지 여부를 판단해야하며, 그렇다면 메모리를 재 할당해야합니다.
- 삽입 또는 삭제 여부에 관계없이 위치를 이동해야하므로 선형 테이블에서 마지막 요소의 위치를 찾아야합니다.