1. 程式人生 > >嚴版資料結構題集2.11

嚴版資料結構題集2.11

設順序表va中的資料元素遞增有序。試寫一演算法,將x插入到順序表的適當位置上,以保持該表的有序性。

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
#define ERROR 0
#define OK 1
#define OVERFLOW -1
#define TRUE 1
typedef int Status;
struct SqList
{
     int *elem;
     int length;
     int listsize;
};

void InitList(SqList &L)
{
     L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
     if(!L.elem)
      exit(OVERFLOW);
     L.length=0;
     L.listsize=LIST_INIT_SIZE;
}

void DestroyList(SqList &L)
{
     free(L.elem);
     L.elem=NULL;
     L.length=0;
     L.listsize=0;
}

Status ListInsert(SqList &L,int i,int e)
{
     int *newbase,*q,*p;
     if(i<1||i>L.length+1)
       return ERROR;
     if(L.length==L.listsize)
     {
          newbase=(int*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(int));
          if(!newbase)
            exit(OVERFLOW);
          L.elem=newbase;
          L.listsize+=LIST_INCREMENT;
        }
        q=L.elem+i-1;
        for(p=L.elem+L.length-1;p>=q;--p)
           *(p+1)=*p;
        *q=e;
        ++L.length;
        return OK;
}

int cmp(const void*a,const void*b)
{ 
     return *(int*)a - *(int*)b;
}

void ListSort(SqList &L)
{    
   qsort(L.elem,L.length,sizeof(int),cmp);  //將線性表按增序排列
    
}

Status Insert_Sqlist(SqList &va,int x)
{
     int i;
     if(va.length+1>va.listsize)  return ERROR;
     va.length++;
     for(i=va.length-1; va.elem[i]>x&&i>=0; i--)
       va.elem[i+1]=va.elem[i];
     va.elem[i+1]=x;
     return OK;
}

void ListTraverse(SqList L,void(*vist)(int&))
{
     int *p=L.elem;
     int i;
     for(i=1; i<=L.length; i++)
    vist(*p++);
   printf("\n");
}


void print1(int &c)
{
     printf("%d ",c);
    
}

int main()
{
     SqList La;
     int i;
     int t=rand()%100;  //隨機生成待插入數
     printf("%d\n",t);
     InitList(La);
     for(i=1; i<=5;i++)
        ListInsert(La,i,rand()%100); //隨機生成5個數
     ListTraverse(La,print1);
     ListSort(La);
     ListTraverse(La,print1);
     Insert_Sqlist(La,t);
     ListTraverse(La,print1);
     return 0;