数据结构试验-Sqlist

    第二次试验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);
        }
}

你可能感兴趣的:(数据结构,c,list,struct,测试,null)