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

【C语言版数据结构】线性表的链式表示,并且实现合并两个非递减有序排列到新的线性表

2013-10-20 16:31 645 查看
/*已知线性表LA和LB中的数据元素按值的非递减有序排列,
现要将LA和LB归并成一个新的线性表LC,且LC中的数据元素仍按值的非递减有序排列*/

//----------------头文件------------------------
#include<stdio.h>
#include<stdlib.h>

//----------------宏定义------------------------
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

//-------------线性表的元素节点-----------------
typedef int ElemType;
typedef int Bool;
typedef struct Node
{
ElemType data;
struct Node *next;
}List, *NList;

//-------------函数列表-------------------------
Bool InitList(NList L);//构造一个空线性表L,创建成功返回OK
Bool InputData(NList L);//初始化线性表,成功返回OK
int ListLength(List L);//求线性表的长度
Bool GetElem(List L,int i,ElemType &e);//用e返回L中第i个数据,成功后返回OK
Bool ListInsert(NList L,ElemType e);//在线性表L的链尾插入元素e,成功返回OK
void MergeList(List La,List Lb,NList Lc);//合并La和Lb到Lc中
void OutPut(NList L);//输出线性表所有元素

//----------------主函数------------------------
int main()
{
List La,Lb,Lc;
InitList(&La);InitList(&Lb);InitList(&Lc);
printf("请输入链La的元素个数:");
InputData(&La);
printf("请输入链Lb的元素个数:");
InputData(&Lb);
MergeList(La,Lb,&Lc);
OutPut(&Lc);
return 0;
}

//----------------子函数的实现-------------------
Bool InitList(NList L)//构造一个空线性表L,创建成功返回OK
{
L->next = NULL;
L->data = 0;
return OK;
}

Bool InputData(NList L)//初始化线性表,成功返回OK
{
int n;
NList Temp_L,p;
scanf("%d",&n);
L->data = n;
p = L;
while(n--)
{
if(!(Temp_L = (NList)malloc(sizeof(List))))
{
exit(OVERFLOW);
}
scanf("%d",&Temp_L->data);
Temp_L->next = NULL;
p->next = Temp_L;
p = Temp_L;
}
return OK;
}

int ListLength(List L)//求线性表的长度
{
return L.data;
}

Bool GetElem(List L,int i,ElemType &e)//用e返回L中第i个数据,成功后返回OK
{
NList p = &L;
if(i<0 || i > p->data)
{
return ERROR;
}
while(i)
{
p = p ->next;
i--;
}
e = p->data;
return OK;
}

Bool ListInsert(NList L,ElemType e)//在线性表L的链尾插入元素e,成功返回OK
{
int L_len = L->data;
NList newNode,p = L;
if(!(newNode = (NList)malloc(sizeof(List))))
{
exit(OVERFLOW);
}
newNode->next = NULL;
newNode->data = e;

while(L_len)
{
p = p->next;
L_len--;
}
p->next = newNode;
L->data++;
return OK;
}

void MergeList(List La,List Lb,NList Lc)
//合并La和Lb到Lc中
{
int i = 1, k = 0,j = 1;
int La_len = ListLength(La);
int Lb_len = ListLength(Lb);
ElemType ai,bj;
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La,i,ai);GetElem(Lb,j,bj);
if(ai <= bj)
{
ListInsert(Lc,ai);
++i;
}
else
{
ListInsert(Lc,bj);
++j;
}
}
while(i<= La_len)
{
GetElem(La,i++,ai);
ListInsert(Lc,ai);
}
while(j<= Lb_len)
{
GetElem(Lb,j++,bj);
ListInsert(Lc,bj);
}

}

void OutPut(NList L)
//输出线性表所有元素
{
NList Temp_L = L->next;
while(Temp_L)
{
printf("%d ",Temp_L->data);
Temp_L = Temp_L->next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐