#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
//å½æ°ç»æç¶æç
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 4
//Statusæ¯å½æ°çç±»åï¼å
¶å¼æ¯å½æ°ç»æçç¶æç
typedef int Status;
//å®ä¹æ°æ®ç±»å
typedef int ElemType;
//----------线æ§è¡¨çå¨æåé
顺åºåå¨ç»æ-------
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;
//-----------åºæ¬æä½--------------------------
Status InitList_sq(SqList *L); //åå§å
void DestroyList_sq(SqList *L); //éæ¯
void ClearList_sq(SqList *L); //置空
Status ListEmpty_sq(SqList *L); //å¦æ表L为空表è¿åTRUE,å¦å为FALSE
Status ListLength_sq(SqList *L); //è¿åLä¸æ°æ®å
ç´ ä¸ªæ°
void GetElem_sq(SqList *L,int i,ElemType *e); //ç¨eè¿åiä½ç½®çå
ç´
Status PriorElem_sq(SqList *L,int cur_e,ElemType *pre_e); //æ±å驱
Status NextElem_sq(SqList *L,int cur_e,ElemType *next_e); //æ±å继
Status ListInsert_sq(SqList *L,int i,ElemType e); //æå
¥
Status ListDelete_sq(SqList *L,int i,ElemType *e); //å é¤
Status ListTransver_sq(SqList *L); //ä¾æ¬¡å¯¹æ¯ä¸ªå
ç´ è°ç¨visit()
Status LocateElem_sq(SqList *L,ElemType e, Status (*compare)(ElemType *,ElemType *));//è¿è¡ä¿©ä¸ªå
ç´ çæ¯è¾
Status MergeList(SqList *La,SqList *Lb,SqList *Lc); //La,Lbå½å¹¶æLc
Status ListAppend_sq(SqList *L,ElemType e);
//-----------顺åºè¡¨åºæ¬æä½çå®ç°--------------
Status InitList_sq(SqList *L)
{
L->elem = (ElemType *)malloc(LIST_INIT_SIZE* sizeof(ElemType));
if(NULL==L->elem)
return OVERFLOW;
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}//InitList_sq
Status ListInsert_sq(SqList *L,int i,ElemType e)
{
if(i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize){
int *newbase;
newbase = (ElemType *)realloc(L->elem,
(L->listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
int *q,*p;
q =&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1) = *p;
*q = e;
++L->length;
return OK;
}//ListInsert_sq
Status ListDelete_sq(SqList *L,int i,ElemType *e)
{
if((i<1)||(i>L->length)) return ERROR;
int *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;
}//ListDelete_sq
int LocateElem_sq(SqList *L,ElemType e, Status(*compare)(ElemType *,ElemType *))
{
int i=1;
int *p=L->elem;
while(i<=L->length&&(*compare)(p++,&e))
++i;
if(i<=L->length) return i;
else return OK;
}//LocateElem_sq
void MergeList_sq(SqList *La,SqList *Lb,SqList *Lc)
{
InitList_sq(Lc);
ElemType ai,bj;
int i=1,j=1,k=0;
int La_len,Lb_len;
La_len=ListLength_sq(La);
Lb_len=ListLength_sq(Lb);
while((i<=La_len)&&(j<=Lb_len)) {
GetElem_sq(La,i,&ai);
GetElem_sq(Lb,j,&bj);
if(ai<=bj)
{
ListInsert_sq(Lc,++k,ai);
++i;
}
else {
ListInsert_sq(Lc,++k,bj);
++j;
}
}
while(i<=La_len){
GetElem_sq(La,i,&ai);
ListInsert_sq(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem_sq(Lb,j,&bj);
ListInsert_sq(Lc,++k,bj);
}
}//MergeList_sq
int compare(ElemType *e1,ElemType *e2)
{
return (*e1-*e2);
}//compare()
void DestroyList_sq(SqList *L)
{
free(L->elem);
L->elem=NULL;
L->length=0;
L->listsize=0;
}//DestroyList_sq()
void ClearList_sq(SqList *L)
{
memset(L->elem,0,L->listsize *sizeof(ElemType));
L->length=0;
}//ClearList_sq
Status ListEmpty_sq(SqList *L)
{
if(L->length>0) return TRUE;
else return FALSE;
}//ListEmpty_sq
int ListLength_sq(SqList *L)
{
return L->length;
}//ListLength_sq
void GetElem_sq(SqList *L,int i,ElemType *e)
{
if((i>=1)&&(i<=ListLength_sq(L)))
*e=L->elem[i-1];
}//GetElem_sq
Status PriorElem_sq(SqList *L,ElemType cur_e,ElemType *pre_e)
{
int i;
i=LocateElem_sq(L,cur_e,compare);
if(i>1) *pre_e=L->elem[i-2];
else return ERROR;
}//PriorElem_sq
Status NextElem_sq(SqList *L,ElemType cur_e,ElemType *next_e)
{
int i,n;
i=LocateElem_sq(L,cur_e,compare);
n=ListLength_sq(L);
if((i>1)&&i<=n-1) *next_e=L->elem[i];
else return ERROR;
}//NextElem_sq
Status ListTransver_sq(SqList *L)
{
int i,n;
n=ListLength_sq(L);
if(n==0)
{
printf("顺åºè¡¨å·²ç»éæ¯ææ¸
空ã\n");
return ERROR;
}
else{
for(i=0;i<n;i++)
printf(" %d",L->elem[i]);
printf("\n");
}
return OK;
}//ListTransver_sq
void PrintElem_sq(ElemType e)
{
printf("%d",e);
}//PrintElem_sq
Status ListAppend_sq(SqList *L,ElemType e)
{
if(L->length>=L->listsize)
{
ElemType *newbase =(ElemType *)realloc(L->elem,(L->length+LISTINCREMENT) *sizeof(ElemType));
if(!newbase)
return ERROR;
L->elem = newbase;
L->listsize +=LISTINCREMENT;
}
L->elem[L->length]=e;
L->length++;
return OK;
}//ListAppend_sq
追é®å¤§å¥ æ没æ 没æç¨å° mallos free å½æ° ç¦ç¨ é¶æ®µèæ ¸ å°å¼è·ªæ±
追çä»è¯´å¯¹äº..