您的位置:首页 > 理论基础 > 数据结构算法

c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表

2012-08-13 13:27 1246 查看


//c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表

//题目:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La与Lb一起为一个新的线性表Lc(值非递减排列)

/*
主要函数思想:
初始化La,Lb,Lc链表头;
输入La,Lb链表数据;
当La链表下一个结点不为空或者Lb链表下一个结点不为空
{
比较La和Lb的结点
{
La的结点>=Lb的结点
{
Lc的结点指向下一个结点为Lb的当前结点;
Lb的结点移到下一个结点;
}
其余
{
Lc的结点指向下一个结点为La的当前结点;
La的结点移到下一个结点;
}
}
Lc移动一个结点;
}
La的下一个结点不为空
{
Lc指向La的剩余部分;
}
其他
{
Lc指向Lb的剩余部分;
}
*/

//--------头文件---------

#include<stdio.h>
#include<stdlib.h>

//--------宏定义---------

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//-----结构体和替换-----

typedef int Data;
typedef struct
{
Data *data;
int length;
int listsize;
}List,*NList;

//-------函数-------
int InitList(NList L);
int InputData(NList L,int n);
Data GetData(NList L,int n);
int Compare(Data a,Data b);
int InsertC(NList L,Data d,int k);
void OutPutC(NList L);

//------主函数------

void main()
{
List La,Lb,Lc,*A=&La,*B=&Lb,*C=&Lc;
int n,i,j,k=0;
Data da,db;
InitList(A);InitList(B);InitList(C);
printf("请输入集合A的元素个数:");
scanf("%d",&n);
InputData(A,n);
printf("请输入集合B的元素个数:");
scanf("%d",&n);
InputData(B,n);
i=A->length;j=B->length;
//printf("A=%d B=%d\n",i,j);
while(i&&j)
{
da=GetData(A,A->length-i);db=GetData(B,B->length-j);
if(Compare(da,db))
{
InsertC(C,da,k++);
i--;
}
else
{
InsertC(C,db,k++);
j--;
}
printf("A=%d B=%d\n",i,j);
}
while(i)
{
da=GetData(A,A->length-i);
InsertC(C,da,k++);
i--;
}
while(j)
{
db=GetData(B,B->length-j);
InsertC(C,db,k++);
j--;
}
OutPutC(C);
}

//-----------其余函数-----------

int InitList(NList L)
{
if(!(L->data=(Data*)malloc(LIST_INIT_SIZE*sizeof(Data))))
{
exit(OVERFLOW);
}
L->length=0;
L->listsize=LIST_INIT_SIZE;
return TRUE;
}

int InputData(NList L,int n)
{
Data *newbase;
printf("输入集合中的元素(递增输入):");
for(;n>0;n--)
{
if(L->length>=L->listsize)
{
if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data))))
{
L->data=newbase;
L->listsize+=LISTINCREMENT;
}
}
scanf("%d",&L->data[L->length++]);
//printf("%d\n",L->length);
}
return TRUE;
}

Data GetData(NList L,int n)
{
if(n<0||n>L->length-1)
{
exit(OVERFLOW);
}
return L->data
;
}

int Compare(Data a,Data b)
{
if(a<=b)
{
return 1;
}
return 0;
}

int InsertC(NList L,Data d,int k)
{
Data *newbase;
if(L->length>=L->listsize)
{
if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data))))
{
L->data=newbase;
L->listsize+=LISTINCREMENT;
}
}
L->data[k]=d;
L->length++;
return TRUE;
}

void OutPutC(NList L)
{
int i=0;
printf("C:");
for(;i<L->length;i++)
{
printf("%d ",L->data[i]);
}
printf("\n");
getchar();
getchar();
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐