对与顺序表的一些理解

来源:互联网 发布:望乎魁首是什么意思 编辑:程序博客网 时间:2024/06/04 18:27
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
//比较全的顺序表,但是ListLocate函数还是没有解决
#define TRUE 1
#define OK 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW -2
#define INFEASIBLE -1
#define LIST_INIT_SIZE 10
#define INCREMENT 5


typedef struct{
int *elem;
int listsize;
int length;
}List;
void InitList(List &L){
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)  exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
L.length=0;
}
void ClearList(List &L){
L.length=0;
}
void DestroyList(List &L){
L.length=0;
free(L.elem);//delete L.elem
}
int ListEmpty(List L){
if(L.length==0)
return TRUE;
else
return FALSE;
}
int ListLength(List L){
return L.length;
}
void GetElem(List L,int i,int &e){
int *p;
p=&(L.elem[i-1]);
e=*p;
}
void ListInsert(List &L,int i,int e){
int *newbase;
if(i<1||i>L.length+1)  exit(ERROR);
if(L.length>=L.listsize){
newbase=(int *)realloc(L.elem,(L.listsize+INCREMENT)*sizeof(int));
if(!newbase) exit(OVERFLOW);
L.listsize=L.listsize+INCREMENT;
L.elem=newbase;
}
int *q,*p;
q=&(L.elem[i-1]);
for(p=&(L.elem[i-1]);p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
}
void ListTraverse(List L){
int i;
for(i=1;i<=L.length;i++){
printf("%3d",L.elem[i-1]);
}
printf("\n");
}
void ListDelete(List &L,int i,int &e){
if(i<1||i>L.length+1) exit(ERROR);
int *q;
q=&(L.elem[i-1]);
e=*q;
for(;q<=&(L.elem[L.length-1]);q++){
*q=*(q+1);
}
L.length--;
}
int LocateElem(List L,int e,int (*compare)(int,int)){
int i,*p;
i=1;
p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e)) ++i;
if(i<=L.length) return i;
else return 0;
}
int compare(int a,int b){
if(a==b) return TRUE;
else return FALSE;
}
void MergeList(List La,List Lb,List &Lc){
int *pa,*pb,*pc;
Lc.length=Lc.listsize=La.length+Lb.length;
Lc.elem=(int *)malloc(Lc.listsize*sizeof(int));
pc=Lc.elem;
pa=La.elem;
pb=Lb.elem;
while(pa<=&(La.elem[La.length-1])&&pb<=&(Lb.elem[Lb.length-1])){
if(*pa<*pb)  
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=&(La.elem[La.length-1])) *pc++=*pa++;
while(pb<=&(Lb.elem[Lb.length-1])) *pc++=*pb++;
}
void Union(List &La,List Lb){
int *newbase;
if(Lb.length>(La.listsize-La.length)){
newbase=(int *)realloc(La.elem,(La.listsize+Lb.length)*sizeof(int));
if(!newbase) exit(OVERFLOW);
La.elem=newbase;
La.listsize+=Lb.length;
}
int e,i,j;
for(i=1;i<=Lb.length;i++){
e=Lb.elem[i-1];
for(j=1;j<=La.length;j++){
if(e==La.elem[j-1])
break;
}
if(j>La.length)
ListInsert(La,La.length+1,e);
}
}


int main(){
int i,e;
List La,Lb,Lc;
InitList(Lb);
InitList(Lc);
InitList(La);
for(i=1;i<5;i++){
scanf("%d",&e);
ListInsert(La,i,e);
}
for(i=1;i<7;i++){
scanf("%d",&e);
ListInsert(Lb,i,e);
}


printf("La=");
ListTraverse(La);
ListDelete(La,1,e);
printf("La=");
ListTraverse(La);
printf("La=");
Union(La,Lb);
ListTraverse(La);
MergeList(La,Lb,Lc);
printf("Lc=");
ListTraverse(Lc);
DestroyList(La);
printf("La=");
ListTraverse(La);
return 0;
}
0 0
原创粉丝点击