第二次试验Sqlist,简单写的没有严格的测试,可以把ElemType改成char,int和double的三种,其他变量需要修改下代码。功能不全有bug还望大家指出。(dev-cpp)
main函数中调用:
#include <stdio.h>
#include "Sqlist.h"
int main()
{
int i,elem,s[]={13,5,27,9,32,123,76,98,54,87};
int a[]={1,3,4,5,9,100,101},b[]={2,2,5,8,12,50,102};
PSqList list,lista,listb,listc;
InitList(&list);
DispList(list);
for(i=0;i<10;i++)
ListInsert(list,ListLength(list)+1,s[i]);
DispList(list);
printf("\nlength:%d\n",ListLength(list));
for(i=1;i<=3;i++)
{
GetElem(list,i,&elem);
printf("%d ",elem);
}
printf("\n76 at %d\n",LocateElem(list,76));
ListInsert(list,4,56);
printf("length:%d\n",ListLength(list));
ListDelete(list,7,&elem);
SortList(list);
DispList(list);
DestroyList(list);
InitList(&lista);
InitList(&listb);
for(i=0; i<7; i++)
{
ListInsert(lista,ListLength(lista)+1,a[i]);
ListInsert(listb,ListLength(listb)+1,b[i]);
}
printf("\n");
DispList(lista);
printf("\n");
DispList(listb);
printf("\n");
listc=UnionList(lista,listb);
DispList(listc);
printf("\n");
return 0;
}
Sqlist.h的内容:
#ifndef __SQLIST_H_
#define __SQLIST_H_ 1
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
typedef int ElemType;
typedef struct T{
ElemType *elem;
int length;
int listsize;
}SqList,*PSqList;
void InitList(PSqList* list);
void DestroyList(PSqList list);
int ListLength(PSqList list);
void PriorElem(PSqList list,ElemType cur_e,ElemType* pre_e);
void NextElem(PSqList list,ElemType cur_e,ElemType* next_e);
void DispList(PSqList list);
int GetElem(PSqList list,int i,ElemType* e);
int LocateElem(PSqList list,ElemType e);
void ListInsert(PSqList list,int i,ElemType e);
void ListDelete(PSqList list,int i,ElemType* e);
void ClearList(PSqList list);
void print(ElemType e);
PSqList UnionList(PSqList lista,PSqList listb);
void SortList(PSqList list);
#endif
Sqlist.c的内容:
void InitList(PSqList* list){
(*list)=(PSqList)malloc(sizeof(SqList));
(*list)->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(*list==NULL) printf("error");
(*list)->length = 0;
(*list)->listsize = LIST_INIT_SIZE*sizeof(ElemType);
memset((*list)->elem,0,sizeof((*list)->elem));
}
void DestroyList(PSqList list){
free(list->elem);
free(list);
}
int ListLength(PSqList list){
return list->length;
}
void PriorElem(PSqList list,ElemType cur_e,ElemType* pre_e){
int i=LocateElem(list,cur_e);
if(i==0||i==1) return;
*pre_e = *(list->elem-2);
}
void NextElem(PSqList list,ElemType cur_e,ElemType* next_e){
int i=LocateElem(list,cur_e);
if(i==0||i==list->length) return;
*next_e = *(list->elem);
}
void DispList(PSqList list){
int i;
if(list->length==0) return;
for(i=0; i<list->length-1; i++){
print(*(list->elem+i));
printf("->");
}
print(*(list->elem+i));
}
int GetElem(PSqList list,int i,ElemType* e){
return *e = *(list->elem+i-1);
}
int LocateElem(PSqList list,ElemType e){
int i=0;
while(i<list->length&&*(list->elem+i)!=e) i++;
if(*(list->elem+i)==e) return i+1;
else return 0;
}
void ListInsert(PSqList list,int i,ElemType e){
int j,end=list->length;
if(i*sizeof(ElemType)>list->listsize) return;
if(end*sizeof(ElemType)>list->listsize){
end --;
list->length--;
}
for(j=end; j&&j+1>i; j--){
*(list->elem+j)=*(list->elem+j-1);
}
*(list->elem+i-1) = e;
list->length++;
}
void ListDelete(PSqList list,int i,ElemType* e){
int j;
for(j=i-1; j<list->length-1; j++){
*(list->elem+j)=*(list->elem+j+1);
}
list->length--;
}
void ClearList(PSqList list){
list->length = 0;
}
void print(ElemType e){
switch(sizeof(e))
{
case 1: printf("%c",e); break;
case 4: printf("%d",e); break;
case 8: printf("%lf",e); break;
default: printf("Can't print.");
}
}
PSqList UnionList(PSqList lista,PSqList listb){
int i=1,j=1,elems;
PSqList listc;
InitList(&listc);
while(i<=ListLength(lista)||j<=ListLength(listb))
{
if(i>ListLength(lista)||GetElem(lista,i,&elems)>GetElem(listb,j,&elems)){
ListInsert(listc,ListLength(listc)+1,GetElem(listb,j++,&elems));
}
else if(j>ListLength(listb)||GetElem(lista,i,&elems)<=GetElem(listb,j,&elems)){
ListInsert(listc,ListLength(listc)+1,GetElem(lista,i++,&elems));
}
}
return listc;
}
void SortList(PSqList list){
int i,j;
for(i=0; i<ListLength(list); i++)
for(j=0; j<ListLength(list)-1;j++)
if(*(list->elem+j)>*(list->elem+j+1)){
*(list->elem+j)^=*(list->elem+j+1);
*(list->elem+j+1)^=*(list->elem+j);
*(list->elem+j)^=*(list->elem+j+1);
}
}