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

归并两个带头结点的递增单链表 结果为递减链表

2016-04-17 13:48 344 查看
归并两个递增单链表,利用原结点让新链表递减有序。

typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;

//创建不带头结点的单链表
void createLinkList(LinkList *&LA, ElemType data[], int n)
{
LinkList *ta;
for (int idx= 0; idx < n; idx++)
{
if (idx <= 0)
{
LA = new LinkList();
LA->data = data[idx];
LA->next = 0;
ta = LA;
}
else
{
ta->next = new LinkList();
ta=ta->next;
ta->data = data[idx];
ta->next=0;
}
}
}

//创建带头结点的单链表
void createLinkList2(LinkList *&L, ElemType data[], int n)
{
L = new LNode();
L->data = -1;
L->next = 0;
LNode *p = L;
for (int idx = 0; idx < n; idx++)
{
p->next =new LNode();
p->next->data = data[idx];
p->next->next = 0;
p = p->next;
}
}

//遍历不带头结点的单链表
void traverseList(LinkList *L)
{
printf("\n");
LNode *p = L;
while (p)
{
printf("%4d", p->data);
p=p->next;
}
}

//遍历带头结点的单链表
void traverseList2(LinkList *L)
{
printf("\n");
LNode *p = L->next;
while (p)
{
printf("%4d", p->data);
p = p->next;
}
}

//释放单链表
void deleteList(LinkList *L)
{
LNode *p = L;
LNode *d = 0;
while (p)
{
d = p;
p=p->next;
delete d;
}
}

//归并两个带头结点的递增单链表 结果为递减链表 利用原表结点
void rMergeList(LinkList *LA, LinkList *LB, LinkList *&LC)
{
LNode *pa = LA->next;
LNode *pb = LB->next;
LNode *pc = 0, *qc = 0;
delete LB;
//归并两个链表 头插
while (pa && pb)
{
if (pa->data < pb->data)
{
if (pc)
{
qc = pa;
pa = pa->next;
qc->next = pc;
pc=qc;
}
else
{
pc=pa;
pa=pa->next;
pc->next = 0;
}
}
else
{
if (pc)
{
qc = pb;
pb = pb->next;
qc->next = pc;
pc = qc;
}
else
{
pc = pb;
pb = pb->next;
pc->next = 0;
}
}
}
//a有剩余
while (pa)
{
if (pc)
{
qc = pa;
pa=pa->next;
qc->next = pc;
pc = qc;
}
else
{
pc = pa;
pa = pa->next;
pc->next = 0;
}
}
//b有剩余
while (pb)
{
if (pc)
{
qc = pb;
pb = pb->next;
qc->next = pc;
pc=qc;
}
else
{
qc = pb;
pb = pb->next;
qc->next = 0;
}
}
//处理LC头
LC = LA;
LC->next = pc;
}

int _tmain(int argc, _TCHAR* argv[])
{
ElemType data[] = {1,2,3,4,5,6,7,8};
LinkList *LA = 0;
LinkList *LB = 0;
LinkList *LC = 0;

createLinkList2(LA, data, 8);
createLinkList2(LB, data, 8);
rMergeList(LA, LB, LC);
traverseList2(LC);

//createLinkList2(LB, data, 8);
//traverseList2(LB);

//deleteList(LA);
//deleteList(LB);

return 0;
}


ps:其实没啥营养的东西,就是自己练习而已,做题过程中,思路有了,代码也在纸上写出来了,可是不知道对错,如果要和答案一模一样也太苛刻了,但是不运行出来也不能保证自己结果正确,运行了花费了一番功夫,就记录下来了。

慢慢的学习,如果没有时间的沉淀,很难夯实基础,让自己自信的过程就是一道一道正确结果的过程。熟练,练习,加油!!!

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