Written by Robert_Wang in Southwest University of Science And Technology.
#include<iostream>
#define Max 100
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType data[Max];
int length;
}SqList;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkList;
void InitList(SqList*&L)
{
L = new SqList;
L->length = 0;
}
void InitList(LinkList*&L)
{
L = new LinkList;
L->next = NULL;
}
void ListInsert(SqList *&L, ElemType e)
{
int i = 0, j;
while (i < L->length && L->data[i] < e) i++;//找到插入的位置
for (j = L->length - 1; j >= i; j--) L->data[j + 1] = L->data[j];
L->data[i] = e;
L->length++;
}
void ListInsert(LinkList *&L, ElemType e)
{
LinkList * pre = L, *p;
while (pre->next && pre->next->data < e) pre = pre->next;
LinkList *s = new LinkList;
s->data = e;
s->next = pre->next;
pre->next = s;
}
//有序表(顺序表)的归并算法
void UnionList(SqList*La, SqList*Lb, SqList *&Lc)
{
int i, j, k;
i = j = k = 0;
Lc = new SqList;
Lc->length = La->length + Lb->length;
//将La Lb分别比较,将较小的赋给Lc
while (i < La->length && j < Lb->length)
{
if (La->data[i] < Lb->data[j]) { Lc->data[k++] = La->data[i++]; }
else { Lc->data[k++] = Lb->data[j++]; }
}
while (i < La->length)//将还剩的元素加进来,二者只有一个还剩有元素
{
Lc->data[k++] = La->data[i++];
}
while (j < Lb->length)
{
Lc->data[k++] = Lb->data[j++];
}
}
int Median(SqList *La, SqList *Lb, SqList *&L)
{
L = new SqList;
int i, j, k;
i = j = k = 0;
//归并La,Lb
while (i < La->length && j < Lb->length)
{
if(La->data[i] < Lb->data[j]) { L->data[k++] = La->data[i++]; }
else { L->data[k++] = Lb->data[j++]; }
}
while (i < La->length) { L->data[k++] = La->data[i++]; }
while (j < Lb->length) { L->data[k++] = Lb->data[j++]; }
L->length = k;
return L->data[(k-1) / 2];
}
void UnionList(LinkList*La, LinkList *Lb, LinkList *&Lc)
{
LinkList *pa = La->next, *pb = Lb->next, *r, *s;
Lc = new LinkList;
Lc->next = NULL;
r = Lc;
while (pa && pb)
{
if (pa->data < pb->data)
{
s = new LinkList;
s->data = pa->data;
s->next = pa->next;
r->next = s;
r = r->next;
pa = pa->next;
}
else
{
s = new LinkList;
s->data = pb->data;
s->next = pb->next;
r->next = s;
r = r->next;
pb = pb->next;
}
}
while (pa)
{
s = new LinkList;
s->data = pa->data;
s->next = pa->next;
r->next = s;
r = r->next;
pa = pa->next;
}
while (pb)
{
s = new LinkList;
s->data = pb->data;
s->next = pb->next;
r->next = s;
r = r->next;
pb = pb->next;
}
r->next = NULL;
}
void DispList(SqList *L)
{
for (int i = 0; i < L->length; i++)
{
cout << L->data[i] << " ";
}
cout << endl;
}
void DispList(LinkList *L)
{
LinkList *p = L->next;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//三个链表公共元素的求法
void commndoe(LinkList *&La, LinkList *Lb, LinkList*Lc)
{
LinkList *pa = La->next, *pb = Lb->next, *pc = Lc->next, *r, *s;
La->next = NULL;
r = La;//新建链表,此时只含有一个头结点
while (pa)
{
while (pb && pb->data < pa->data) pb = pb->next;
while (pc && pc->data < pa->data) pc = pc->next;
if (pb && pc && pa->data == pb->data && pa->data == pc->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
s = pa;
pa = pa->next;
delete pa;
}
}
r->next = NULL;
}
int Listlength(SqList*L)
{
return L->length;
}
//删除链表中相同的元素
void del(LinkList *&L)
{
LinkList *pre = L->next, *p = L->next->next,*r;
while (p!=NULL && pre!=NULL)
{
if (pre->data == p->data)
{
r = p->next;
pre->next = p->next;
delete p;
p = r;
}
else
{
pre = pre->next;
p = p->next;
}
}
}
//void del(LinkList *&L)
//{
// LinkList *p = L->next, *q;
// while (p)
// {
// q = p->next;
// if (p->data == p->next->data)
// {
// p->next = q->next;
// delete q;
// }
// else
// {
// p = p->next;
// }
// }
//}
int main()
{
/*LinkList * L;
InitList(L);
int i;
for (i =10;i>=1; i--)
{
ListInsert(L, i);
}
DispList(L);*/
//以下为顺序表的操作
SqList* L,*M,*N;
InitList(L);
InitList(M);
InitList(N);
ListInsert(L, 11);
ListInsert(L, 13);
ListInsert(L, 15);
ListInsert(L, 17);
ListInsert(L, 19);
L->length = 5;
ListInsert(M, 2);
ListInsert(M, 4);
ListInsert(M, 6);
ListInsert(M, 8);
ListInsert(M, 20);
M->length = 5;
//UnionList(L, M, N);
cout << "N的中位数为: " << Median(L,M,N) << endl;
cout << "N的长度为: " << Listlength(N) << endl;
DispList(N);
//以下为链表的操作
/*LinkList *l1, *l2, *l3;
InitList(l1);
InitList(l2);
InitList(l3);
for (int i = 10; i >= 1; i--)
{
if (i % 2) ListInsert(l1, 3);
}
DispList(l1);
cout << "l1 has been del some node which are the same!" << endl;
del(l1);
DispList(l1);*/
return 0;
}