#include <iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
typedef struct LNode
{
ElemType data; //存放元素值
struct LNode* next; //指向后继结点
int length;
}LinkNode;
void CreateListR(LinkNode*& L, ElemType a[], int n)
{
LinkNode* s, * r;
L = (LinkNode*)malloc(sizeof(LinkNode));
r = L;
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
cout << "利用尾插法,单链表建立成功!" << endl;
}
void DispList(LinkNode* L)
{
cout << "线性表输入如下:" << endl;
LinkNode* p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
cout << "\t";
}
cout << "\n" << endl;
}
//有序表插入(以单链表方式)
void ListInsertd1(LinkNode*& L, ElemType e)
{
LinkNode* pre = L, * p;
while (pre->next != NULL && pre->next->data < e)
pre = pre->next;
p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = e;
p->next = pre->next;
pre->next = p;
cout << "插入成功!" << endl;
}
//采用单链表存放有序表的二路归并算法如下
void UnionList1(LinkNode* LA, LinkNode* LB, LinkNode*& LC)
{
LinkNode* pa = LA->next, * pb = LB->next, * r, * s;
LC = (LinkNode*)malloc(sizeof(LinkNode)); //创建LC头节点
r = LC;
while (pa != NULL && pb != NULL)
{
if (pa->data < pb->data)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = pa->data;
r->next = s; r = s;
pa = pa->next;
}
else
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = pb->data;
s->next = s;
r = s;
pb = pb->next;
}
}
while (pa != NULL)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = pa->data;
r->next = s;
r = s;
pa = pa->next;
}
while (pb != NULL)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = pb->data;
r->next = s;
r = s;
pb = pb->next;
}
cout << "归并成功" << endl;
r->next = NULL;
}
int main()
{
ElemType LA[] = { 1,5,6,8 };
ElemType LB[] = { 4,7,9 };
cout << "单链表法:" << endl;
cout << endl;
LinkNode* LN1; LinkNode* LN2; LinkNode* LN3;
CreateListR(LN1, LA, 4);
DispList(LN1);
CreateListR(LN2, LB, 3);
DispList(LN2);
ListInsertd1(LN2, 99);
DispList(LN2);
UnionList1(LN1, LN2, LN3);
DispList(LN3);
system("pause");
return 0;
}