您的位置:首页 > 其它

1.2链式结构 实现 C = A U B

2016-05-17 13:02 281 查看
// 链式结构 实现 C = AUB
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
int data;
struct Node *next;
}*LinkList;

bool InitList(LinkList *L); //创建空链表
bool ListInsert(LinkList L,int pos,int e); //在链表的第pos个位置插入e
bool ListTraverse(LinkList L); //遍历输出链表中各元素

bool GetElem(LinkList L,int pos,int *e);//把第pos个位置的元素赋给e
int ListLength(LinkList L); //求链表的长度
void MergeList(LinkList La,LinkList Lb,LinkList *Lc);

int main()
{
LinkList La, Lb, Lc;
int i, a[4] = {3,5,8,11}, b[7] = {2,6,8,9,11,15,20};
InitList(&La);
for(i = 1; i <= 4; i++)
ListInsert(La,i,a[i-1]);
printf("La = ");
ListTraverse(La);

InitList(&Lb);
for(i = 1; i <= 7; i++)
ListInsert(Lb,i,b[i-1]);
printf("Lb = ");
ListTraverse(Lb);

MergeList(La,Lb,&Lc);
printf("Lc = ");
ListTraverse(Lc);
return 0;
}

bool InitList(LinkList *L) //创建空链表
{
(*L) = (LinkList)malloc(sizeof(Node));
if(*L == NULL)
{
printf("内存分配失败 程序终止!|n");
exit(-1);
}
(*L)->next = NULL;
return true;
}

bool ListInsert(LinkList L,int pos,int e) //在链表的第pos个位置插入e
{
int j = 0;
LinkList p, s;
p = L;
while(p != NULL && j < pos - 1)  //寻找第pos - 1 个结点
{
p = p->next;
j++;
}
if(p == NULL || j > pos - 1)
return false;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}

bool ListTraverse(LinkList L)//遍历输出链表中各元素
{
LinkList p;
p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return true;
}

void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
{
//已知线性表La和Lb中的数据元素按值 非递减排列
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
int i = 1, j = 1, k = 0;
int La_len, Lb_len;
int ai, bj;
InitList(Lc); //创建空表Lc
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while(i <= La_len && j <= Lb_len)
{
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)
{
GetElem(Lb,j++,&bj);
ListInsert(*Lc,++k,bj);
}
}

int ListLength(LinkList L) //求链表的长度
{
int i= 0;
LinkList p = L->next;
while(p != NULL)
{
i++;
p = p->next;
}
return i;
}

bool GetElem(LinkList L,int pos,int *e)//把第pos个位置的元素赋给e
{
int j = 1; //j为计数器
LinkList p = L->next; // p指向第一个结点
while(p != NULL && j < pos) //顺指针向后查找 直到p指向第i个元素 或 p为空
{
p = p->next;
j++;
}
if(p == NULL || j > pos)
return false;
*e = p->data;  //取第pos个元素
return true;
}

程序执行结果:

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