データ構造(手順表の2つの操作)
6758 ワード
順序表のA及びBの連結動作と、非逓減型の連続表を一つの非逓減型の順序表に結合する.
頭のファイルの内容が多いので、ここではincludeを使っていません.~ブログで~そのままコピーしました.~木に添削があります.
頭のファイルの内容が多いので、ここではincludeを使っていません.~ブログで~そのままコピーしました.~木に添削があります.
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc() */
#include<limits.h> /* INT_MAX */
#include<stdio.h> /* EOF(=^Z F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/* */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 math.h OVERFLOW 3, */
typedef int Status; /* Status , , OK */
typedef int Boolean; /* Boolean , TRUE FALSE */
typedef int ElemType;
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 2
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
//----start---------- (12 ) ----------------start---------------//
Status InitList(SqList *L)
{ /* : */
(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!(*L).elem)
exit(OVERFLOW); /* */
(*L).length=0; /* 0 */
(*L).listsize=LIST_INIT_SIZE; /* */
return OK;
}
Status DestroyList(SqList *L)
{ /* : L 。 : L */
free((*L).elem);
(*L).elem=NULL;
(*L).length=0;
(*L).listsize=0;
return OK;
}
Status ClearList(SqList *L)
{ /* : L 。 : L */
(*L).length=0;
return OK;
}
Status ListEmpty(SqList L)
{ /* : L 。 : L , TRUE, FALSE */
if(L.length==0)
return TRUE;
else
return FALSE;
}
int ListLength(SqList L)
{ /* : L 。 : L */
return L.length;
}
Status GetElem(SqList L,int i,ElemType *e)
{ /* : L ,1≤i≤ListLength(L) */
/* : e L i */
if(i<1||i>L.length)
exit(ERROR);
*e=*(L.elem+i-1);
return OK;
}
int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ /* : L ,compare() ( 1, 0) */
/* : L 1 e compare() 。 */
/* , 0。 2.6 */
ElemType *p;
int i=1; /* i 1 */
p=L.elem; /* p 1 */
while(i<=L.length&&!compare(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
{ /* : L */
/* : cur_e L , , pre_e , */
/* ,pre_e */
int i=2;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length)
return INFEASIBLE;
else
{
*pre_e=*--p;
return OK;
}
}
Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
{ /* : L */
/* : cur_e L , , next_e , */
/* ,next_e */
int i=1;
ElemType *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
i++;
p++;
}
if(i==L.length)
return INFEASIBLE;
else
{
*next_e=*++p;
return OK;
}
}
Status ListInsert(SqList *L,int i,ElemType e) /* 2.4 */
{ /* : L ,1≤i≤ListLength(L)+1 */
/* : L i e,L 1 */
ElemType *newbase,*q,*p;
if(i<1||i>(*L).length+1) /* i */
return ERROR;
if((*L).length>=(*L).listsize) /* , */
{
newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW); /* */
(*L).elem=newbase; /* */
(*L).listsize+=LISTINCREMENT; /* */
}
q=(*L).elem+i-1; /* q */
for(p=(*L).elem+(*L).length-1;p>=q;--p) /* */
*(p+1)=*p;
*q=e; /* e */
++(*L).length; /* 1 */
return OK;
}
Status ListDelete(SqList *L,int i,ElemType *e) /* 2.5 */
{ /* : L ,1≤i≤ListLength(L) */
/* : L i , e ,L 1 */
ElemType *p,*q;
if(i<1||i>(*L).length) /* i */
return ERROR;
p=(*L).elem+i-1; /* p */
*e=*p; /* e */
q=(*L).elem+(*L).length-1; /* */
for(++p;p<=q;++p) /* */
*(p-1)=*p;
(*L).length--; /* 1 */
return OK;
}
Status ListTraverse(SqList L,int (*vi)(ElemType*))
{ /* : L */
/* : L vi()。 vi() , */
/* vi() '&', vi() */
ElemType *p;
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(p++);
printf("
");
return OK;
}
//---------end----- (12 ) ---------------end----------------//
Status equal(ElemType c1,ElemType c2)
{ // ,Union()
if(c1==c2)
return TRUE;
else
return FALSE;
}
void Union(SqList &La,SqList Lb) // 2.1
{ // Lb La La
ElemType e;
int La_len,Lb_len;
int i;
La_len=ListLength(La); //
Lb_len=ListLength(Lb);
for(i=1;i<=Lb_len;i++)
{
GetElem(Lb,i,&e); // Lb i e
if(!LocateElem(La,e,equal)) // La e ,
ListInsert(&La,++La_len,e);
}
}
int print(ElemType *c)
{
printf("%d ",*c);
return 0;
}
void MergeList(SqList La,SqList Lb,SqList *Lc) /* 2.2 */
{ /* La Lb 。 */
/* La Lb Lc,Lc */
int i=1,j=1,k=0;
int La_len,Lb_len;
ElemType ai,bj;
InitList(Lc); /* Lc */
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len) /* La Lb */
{
GetElem(La,i,&ai);
GetElem(Lb,j,&bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len) /* La Lb */
{
GetElem(La,i++,&ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) /* Lb La */
{
GetElem(Lb,j++,&bj);
ListInsert(Lc,++k,bj);
}
}
int main()
{
SqList La,Lb,Lc;
Status i;
int j;
i=InitList(&La);
if(i==1) // La
for(j=1;j<=5;j++) // La 5
i=ListInsert(&La,j,j);
printf("La= "); // La
ListTraverse(La,print);
InitList(&Lb); //
for(j=1;j<=5;j++) // Lb 5
i=ListInsert(&Lb,j,2*j);
printf("Lb= "); // Lb
ListTraverse(Lb,print);
Union(La,Lb);
printf("new La= "); // La
ListTraverse(La,print);
InitList(&Lc);// Lc
MergeList(La,Lb,&Lc);
printf("
Lc= "); /* Lc */
ListTraverse(Lc,print);
printf("
");
return 0;
}