两个非递减有序表的合并_Page_39
2016-01-04 23:03
309 查看
头文件:LinkList_L.h
#include<cstdlib>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}*Link, *Position;
typedef struct
{
Link head, tail;
int len;
}LinkList_L;
//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR
Status MakeNode(Link& p, ElemType e)
{
p = (Link)malloc(sizeof(LNode));
if (!p)
return ERROR;
p->data = e;
return OK;
}
//释放p所指向的结点
void FreeNode(Link& p)
{
free(p);
p = NULL;
}
//构造一个空的线性链表L
Status InitList(LinkList_L& L)
{
L.head = (Link)malloc(sizeof(LNode));
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
return OK;
}
//销毁线性链表L
Status DestroyList(LinkList_L& L)
{
Link p = L.head->next;
while (p)
{
Link q = p->next;
FreeNode(p);
p = q;
}
FreeNode(L.head);
return OK;
}
//将线性链表L置为空表
Status ClearList(LinkList_L& L)
{
if (!L.head->next)
{
L.tail = L.head;
L.len = 0;
return OK;
}
Link p = L.head->next;
while (p)
{
Link q = p->next;
FreeNode(p);
p = q;
}
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
return OK;
}
//已知h指向线性链表的头结点,将s所指向结点插入在第一个结点之前
Status InsFirst(Link h, Link s)
{
s->next = h->next;
h->next = s;
return OK;
}
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回
Status DelFirst(Link h, Link& q)
{
q = h->next;
if (q)
{
h->next = q->next;
q->next = NULL;
return OK;
}
return ERROR;
}
//将指针s所指向的一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点
Status Append(LinkList_L& L, Link s)
{
int num=0;
L.tail->next = s;
while (s)
{
num++;
if (!s->next)
{
L.tail = s;
L.len += num;
return OK;
}
s = s->next;
}
return ERROR;
}
//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点
Status Remove(LinkList_L& L, Link& q)
{
if (L.head == L.tail)
return ERROR;
Link s = L.head;
while (s)
{
if (L.tail == s->next)
{
q = s->next;
s->next = NULL;
L.tail = s;
L.len--;
return OK;
}
s = s->next;
}
return ERROR;
}
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,并修改指针p指向新插入的结点
Status InsBefore(LinkList_L& L, Link& p, Link s)
{
Link q = L.head;
while (q)
{
if (q->next==p)
{
q->next = s;
s->next = p;
p = s;
L.len++;
return OK;
}
q = q->next;
}
return ERROR;
}
//已知p指向线性链表L中的一个结点,将s所指结点插入p所指结点之后,并修改指针p指向新插入的结点
Status InsAfter(LinkList_L& L, Link& p, Link s)
{
s->next = p->next;
p->next = s;
p = s;
if (!p->next)
L.tail = p;
L.len++;
return OK;
}
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值
Status SetCurElem(Link& p, ElemType e)
{
p->data = e;
return OK;
}
//已知p指向线性链表中的一个结点,返回p所指向结点中数据元素的值
ElemType GetCurElem(Link p)
{
return p->data;
}
//若线性链表L为空,则返回TRUE;否则返回FALSE
Status ListEmpty(LinkList_L L)
{
if (!L.len)
return TRUE;
else
return FALSE;
}
//返回线性链表L中元素个数
int ListLength(LinkList_L L)
{
return L.len;
}
//返回线性链表L中头结点的位置
Position GetHead(LinkList_L L)
{
return L.head;
}
//返回线性链表L中最后一个结点的位置
Position GetLast(LinkList_L L)
{
if (L.head->next)
return L.tail;
else
return NULL;
}
//已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置,若无前驱则返回NULL
Position PriorPos(LinkList_L L, Link p)
{
if (p == L.head->next)
return NULL;
Link q = L.head->next;
while (q&&q->next)
{
if (q->next == p)
return q;
q = q->next;
}
return NULL;
}
//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置,若无后继则返回NULL
Position NextPos(LinkList_L L, Link p)
{
if (p->next == NULL)
return NULL;
return p->next;
}
//返回p指示线性链表L中第i个结点的位置,并返回OK,i值不合法时返回ERROR
Status LocatePos(LinkList_L L, int i, Link& p)
{
if (i<1 || i>ListLength(L))
return ERROR;
int j = 0;
p = L.head;
while (j<i)
{
p = p->next;
++j;
}
return OK;
}
//关系函数,例如小于等于
Status compare(ElemType a, ElemType b)
{
if (a <= b)
return TRUE;
else
return FALSE;
}
//返回线性链表L中第1个与e满足函数compare()判定关系的元素的位置,若不存在这样的元素则返回NULL
Position LocateElem(LinkList_L L, ElemType e, Status(*compare)(ElemType, ElemType))
{
Link p = L.head->next;
while (p&&!(*compare)(e,p->data))
{
p = p->next;
if (!p)
return NULL;
}
if (!p)
return NULL;
else
return p;
}
//访问并打印
Status visit(ElemType i)
{
if (cout << i << " ")
return OK;
else
return ERROR;
}
//依次对L的每个元素调用函数visit().一旦visit()失败,则操作失败
Status ListTraverse(LinkList_L L, Status(*visit)(ElemType))
{
Link p = L.head->next;
while (p)
{
if (!(*visit)(p->data))
return ERROR;
p = p->next;
}
return OK;
}
//在带头结点的单链表L的第i个元素之前插入元素e
Status ListInsert(LinkList_L& L, int i, ElemType e)
{
Link h, s;
if (!(MakeNode(s, e)))
return ERROR;
if (1 == i)
{
InsFirst(L.head, s);
L.tail = s;
L.len++;
return OK;
}
if (!LocatePos(L, i-1, h))
return ERROR;
InsFirst(h, s);
while (s)
{
if (!s->next)
L.tail = s;
s = s->next;
}
L.len++;
return OK;
}
//在带头结点的单链表L中删除第i个元素,并用e返回
Status ListDelete(LinkList_L& L, int i, ElemType& e)
{
Link p;
if (!LocatePos(L, i, p))
return ERROR;
e = p->data;
Link s = PriorPos(L, p);
if (!s)
return ERROR;
s->next = p->next;
if (!p->next)
L.tail = s;
FreeNode(p);
L.len--;
return OK;
}
主函数:
#include"LinkList_L.h"
//已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
Status MergeList(LinkList_L& La, LinkList_L& Lb, LinkList_L& Lc)
{
InitList(Lc);
Link ha = GetHead(La);
Link hb = GetHead(Lb);
Link pa = NextPos(La, ha);
Link pb = NextPos(Lb, hb);
int j = 1;
while (pa && pb)
{
Link q;
ElemType a = GetCurElem(pa);
ElemType b = GetCurElem(pb);
if ((*compare)(a, b) )
{
DelFirst(ha, q);
Append(Lc, q);
//ListInsert(Lc, j++, pa->data);
pa = NextPos(La, ha);
}
else
{
DelFirst(hb, q);
Append(Lc, q);
//ListInsert(Lc, j++, pb->data);
pb = NextPos(Lb, hb);
}
}
if (pa)
Append(Lc, pa);
else
Append(Lc, pb);
FreeNode(ha);
FreeNode(hb);
return OK;
}
void main(void)
{
int i = 1, j = 1;
int a[] = { 3,5,8,11 };
int b[] = { 2,6,8,9,11,15,20 };
LinkList_L La, Lb, Lc;
InitList(La);
for (i = 0; i < 4; ++i)
ListInsert(La, j++, a[i]);
cout << "线性表La的数据元素按非递减有序排列为:" << endl;
ListTraverse(La, visit);
cout << endl;
InitList(Lb);
for (i = 0, j = 1; i < 7; ++i)
ListInsert(Lb, j++, b[i]);
cout << "线性表Lb的数据元素按非递减有序排列为:" << endl;
ListTraverse(Lb, visit);
cout << endl;
cout << "将表La和Lb合并,结果仍按非递减有序排列,结果为:" << endl;
MergeList(La, Lb, Lc);
ListTraverse(Lc, visit);
cout << endl;
}
#include<cstdlib>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}*Link, *Position;
typedef struct
{
Link head, tail;
int len;
}LinkList_L;
//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR
Status MakeNode(Link& p, ElemType e)
{
p = (Link)malloc(sizeof(LNode));
if (!p)
return ERROR;
p->data = e;
return OK;
}
//释放p所指向的结点
void FreeNode(Link& p)
{
free(p);
p = NULL;
}
//构造一个空的线性链表L
Status InitList(LinkList_L& L)
{
L.head = (Link)malloc(sizeof(LNode));
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
return OK;
}
//销毁线性链表L
Status DestroyList(LinkList_L& L)
{
Link p = L.head->next;
while (p)
{
Link q = p->next;
FreeNode(p);
p = q;
}
FreeNode(L.head);
return OK;
}
//将线性链表L置为空表
Status ClearList(LinkList_L& L)
{
if (!L.head->next)
{
L.tail = L.head;
L.len = 0;
return OK;
}
Link p = L.head->next;
while (p)
{
Link q = p->next;
FreeNode(p);
p = q;
}
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
return OK;
}
//已知h指向线性链表的头结点,将s所指向结点插入在第一个结点之前
Status InsFirst(Link h, Link s)
{
s->next = h->next;
h->next = s;
return OK;
}
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回
Status DelFirst(Link h, Link& q)
{
q = h->next;
if (q)
{
h->next = q->next;
q->next = NULL;
return OK;
}
return ERROR;
}
//将指针s所指向的一串结点链接在线性链表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点
Status Append(LinkList_L& L, Link s)
{
int num=0;
L.tail->next = s;
while (s)
{
num++;
if (!s->next)
{
L.tail = s;
L.len += num;
return OK;
}
s = s->next;
}
return ERROR;
}
//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点
Status Remove(LinkList_L& L, Link& q)
{
if (L.head == L.tail)
return ERROR;
Link s = L.head;
while (s)
{
if (L.tail == s->next)
{
q = s->next;
s->next = NULL;
L.tail = s;
L.len--;
return OK;
}
s = s->next;
}
return ERROR;
}
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,并修改指针p指向新插入的结点
Status InsBefore(LinkList_L& L, Link& p, Link s)
{
Link q = L.head;
while (q)
{
if (q->next==p)
{
q->next = s;
s->next = p;
p = s;
L.len++;
return OK;
}
q = q->next;
}
return ERROR;
}
//已知p指向线性链表L中的一个结点,将s所指结点插入p所指结点之后,并修改指针p指向新插入的结点
Status InsAfter(LinkList_L& L, Link& p, Link s)
{
s->next = p->next;
p->next = s;
p = s;
if (!p->next)
L.tail = p;
L.len++;
return OK;
}
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值
Status SetCurElem(Link& p, ElemType e)
{
p->data = e;
return OK;
}
//已知p指向线性链表中的一个结点,返回p所指向结点中数据元素的值
ElemType GetCurElem(Link p)
{
return p->data;
}
//若线性链表L为空,则返回TRUE;否则返回FALSE
Status ListEmpty(LinkList_L L)
{
if (!L.len)
return TRUE;
else
return FALSE;
}
//返回线性链表L中元素个数
int ListLength(LinkList_L L)
{
return L.len;
}
//返回线性链表L中头结点的位置
Position GetHead(LinkList_L L)
{
return L.head;
}
//返回线性链表L中最后一个结点的位置
Position GetLast(LinkList_L L)
{
if (L.head->next)
return L.tail;
else
return NULL;
}
//已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置,若无前驱则返回NULL
Position PriorPos(LinkList_L L, Link p)
{
if (p == L.head->next)
return NULL;
Link q = L.head->next;
while (q&&q->next)
{
if (q->next == p)
return q;
q = q->next;
}
return NULL;
}
//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置,若无后继则返回NULL
Position NextPos(LinkList_L L, Link p)
{
if (p->next == NULL)
return NULL;
return p->next;
}
//返回p指示线性链表L中第i个结点的位置,并返回OK,i值不合法时返回ERROR
Status LocatePos(LinkList_L L, int i, Link& p)
{
if (i<1 || i>ListLength(L))
return ERROR;
int j = 0;
p = L.head;
while (j<i)
{
p = p->next;
++j;
}
return OK;
}
//关系函数,例如小于等于
Status compare(ElemType a, ElemType b)
{
if (a <= b)
return TRUE;
else
return FALSE;
}
//返回线性链表L中第1个与e满足函数compare()判定关系的元素的位置,若不存在这样的元素则返回NULL
Position LocateElem(LinkList_L L, ElemType e, Status(*compare)(ElemType, ElemType))
{
Link p = L.head->next;
while (p&&!(*compare)(e,p->data))
{
p = p->next;
if (!p)
return NULL;
}
if (!p)
return NULL;
else
return p;
}
//访问并打印
Status visit(ElemType i)
{
if (cout << i << " ")
return OK;
else
return ERROR;
}
//依次对L的每个元素调用函数visit().一旦visit()失败,则操作失败
Status ListTraverse(LinkList_L L, Status(*visit)(ElemType))
{
Link p = L.head->next;
while (p)
{
if (!(*visit)(p->data))
return ERROR;
p = p->next;
}
return OK;
}
//在带头结点的单链表L的第i个元素之前插入元素e
Status ListInsert(LinkList_L& L, int i, ElemType e)
{
Link h, s;
if (!(MakeNode(s, e)))
return ERROR;
if (1 == i)
{
InsFirst(L.head, s);
L.tail = s;
L.len++;
return OK;
}
if (!LocatePos(L, i-1, h))
return ERROR;
InsFirst(h, s);
while (s)
{
if (!s->next)
L.tail = s;
s = s->next;
}
L.len++;
return OK;
}
//在带头结点的单链表L中删除第i个元素,并用e返回
Status ListDelete(LinkList_L& L, int i, ElemType& e)
{
Link p;
if (!LocatePos(L, i, p))
return ERROR;
e = p->data;
Link s = PriorPos(L, p);
if (!s)
return ERROR;
s->next = p->next;
if (!p->next)
L.tail = s;
FreeNode(p);
L.len--;
return OK;
}
主函数:
#include"LinkList_L.h"
//已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
Status MergeList(LinkList_L& La, LinkList_L& Lb, LinkList_L& Lc)
{
InitList(Lc);
Link ha = GetHead(La);
Link hb = GetHead(Lb);
Link pa = NextPos(La, ha);
Link pb = NextPos(Lb, hb);
int j = 1;
while (pa && pb)
{
Link q;
ElemType a = GetCurElem(pa);
ElemType b = GetCurElem(pb);
if ((*compare)(a, b) )
{
DelFirst(ha, q);
Append(Lc, q);
//ListInsert(Lc, j++, pa->data);
pa = NextPos(La, ha);
}
else
{
DelFirst(hb, q);
Append(Lc, q);
//ListInsert(Lc, j++, pb->data);
pb = NextPos(Lb, hb);
}
}
if (pa)
Append(Lc, pa);
else
Append(Lc, pb);
FreeNode(ha);
FreeNode(hb);
return OK;
}
void main(void)
{
int i = 1, j = 1;
int a[] = { 3,5,8,11 };
int b[] = { 2,6,8,9,11,15,20 };
LinkList_L La, Lb, Lc;
InitList(La);
for (i = 0; i < 4; ++i)
ListInsert(La, j++, a[i]);
cout << "线性表La的数据元素按非递减有序排列为:" << endl;
ListTraverse(La, visit);
cout << endl;
InitList(Lb);
for (i = 0, j = 1; i < 7; ++i)
ListInsert(Lb, j++, b[i]);
cout << "线性表Lb的数据元素按非递减有序排列为:" << endl;
ListTraverse(Lb, visit);
cout << endl;
cout << "将表La和Lb合并,结果仍按非递减有序排列,结果为:" << endl;
MergeList(La, Lb, Lc);
ListTraverse(Lc, visit);
cout << endl;
}
相关文章推荐
- windows下搭建react native开发环境
- 【科普】#001 大数据相关技术技术
- 分页场景SQL如何优化
- Mysql Cluster集群错误“table is full”
- vc自绘控件总结
- Linux LVM磁盘扩容
- 自定义 URL Scheme 完全指南
- 挑战编程题(三)
- easyui-tabs 页签绑定click事件,动态加载jqgrid
- Java中通过Selenium WebDriver定位iframe中的元素
- gephi不能选择分割参数
- JAVA多线程机制之死锁
- Android studio的ndk开发
- 从模板驱动文件ins产生cls、cfg文件的方法
- 字符串操作
- Java学习----不该初始化的class(抽象类)
- python中if __name__==’__main__’的作用
- vc6.0缓冲区
- 虚拟列分区
- 彻底搞定C语言指针详解-完整版-时候初学者-必备