第4周项目3 单链表应用
2015-10-05 16:34
483 查看
问题及代码:
/*文件名称:main.cpp linklist.h linklist.cpp
*作者:郑孚嘉
*问题描述:
完成下面的应用时,除项目中给出的特殊要求,其余工作均可利用项目2完成的算法支持。
1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为
a1。实现这个算法,并完成测试。
提示:实现算法时,可以设计下面的函数:void Reverse(LinkList *&L)
2、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
提示:实现算法时,可以设计下面的函数:void Link(LinkList &L1, LinkList &L2)
3、设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。
*/
应用1:Reverse函数
应用2:Link函数
应用3:dizeng函数
以上三个应用中的函数需要写到算法库中(linklist.cpp),同时头文件(linklist.h)要有相应函数声明。
main.cpp(测试)
运行结果:
知识点总结:
应用2的Link(将L2连接到L1的后面)这个算法的时间复杂度为O(m),只需要由L1的头节点找到其尾节点即可,与L1的长度相关,与L2的长度n无关。
/*文件名称:main.cpp linklist.h linklist.cpp
*作者:郑孚嘉
*问题描述:
完成下面的应用时,除项目中给出的特殊要求,其余工作均可利用项目2完成的算法支持。
1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为
a1。实现这个算法,并完成测试。
提示:实现算法时,可以设计下面的函数:void Reverse(LinkList *&L)
2、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
提示:实现算法时,可以设计下面的函数:void Link(LinkList &L1, LinkList &L2)
3、设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。
*/
应用1:Reverse函数
void Reverse(LinkList *&L) { LinkList *q,*p=L->next; L->next=NULL; while(p!=NULL) { q=p->next; p->next=L->next; L->next=p; p=q; } }
应用2:Link函数
void Link(LinkList *&L1, LinkList *&L2) { LinkList *p=L1; while(p->next!=NULL) { p=p->next; } p->next=L2->next; free(L2); }
应用3:dizeng函数
void dizeng(LinkList *L1) { if(L1->next==NULL) { printf("Linklist NULL\n"); return ; } LinkList *p=L1->next; bool dz=true; while(p->next!=NULL) { if(p->next->data>=p->data) { p=p->next; } else { dz=false; break; } } if(dz) { printf("Yes!\n"); } else { printf("No!\n"); } }
以上三个应用中的函数需要写到算法库中(linklist.cpp),同时头文件(linklist.h)要有相应函数声明。
main.cpp(测试)
#include "linklist.h" int main() { LinkList *L1,*L2; InitList(L1); ListInsert(L1, 1, 4); ListInsert(L1, 1, 3); ListInsert(L1, 1, 2); ListInsert(L1, 1, 1); InitList(L2); ListInsert(L2, 1, 8); ListInsert(L2, 1, 7); ListInsert(L2, 1, 6); ListInsert(L2, 1, 5); printf("L1 :"); DispList(L1); printf("L2 :"); DispList(L2); printf("Link L1 and L2 :"); Link(L1,L2); DispList(L1); printf("Reverse L2 :"); Reverse(L2); DispList(L2); printf("Is L1 increasing?\n"); dizeng(L1); printf("Is L2 increasing?\n"); dizeng(L2); return 0; }
运行结果:
知识点总结:
应用2的Link(将L2连接到L1的后面)这个算法的时间复杂度为O(m),只需要由L1的头节点找到其尾节点即可,与L1的长度相关,与L2的长度n无关。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题