归并两个带头结点的递增单链表 结果为递减链表
2016-04-17 13:48
344 查看
归并两个递增单链表,利用原结点让新链表递减有序。
ps:其实没啥营养的东西,就是自己练习而已,做题过程中,思路有了,代码也在纸上写出来了,可是不知道对错,如果要和答案一模一样也太苛刻了,但是不运行出来也不能保证自己结果正确,运行了花费了一番功夫,就记录下来了。
慢慢的学习,如果没有时间的沉淀,很难夯实基础,让自己自信的过程就是一道一道正确结果的过程。熟练,练习,加油!!!
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:其实没啥营养的东西,就是自己练习而已,做题过程中,思路有了,代码也在纸上写出来了,可是不知道对错,如果要和答案一模一样也太苛刻了,但是不运行出来也不能保证自己结果正确,运行了花费了一番功夫,就记录下来了。
慢慢的学习,如果没有时间的沉淀,很难夯实基础,让自己自信的过程就是一道一道正确结果的过程。熟练,练习,加油!!!
相关文章推荐
- [C/C++]反转链表
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例