2015年大二上-数据结构-链表(3)-单链表算法
2015-11-03 12:28
447 查看
1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。
运行结果:
2、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年11月2日
*版本号:v1.0
*
*问题描述:已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。
*输入描述:无。
*输出描述:输出连接后的链表。
*/
#include "LinkList.h"
#include<stdio.h>
void Link(LinkList *&L1, LinkList *&L2)
{
LinkList *p=L1;
while(p->next!=NULL)
{
p=p->next;
}
p->next=L2->next;
free(L2);
}
int main()
{
LinkList *A, *B;
int i;
ElemType a[]= {1,3,2,9};
ElemType b[]= {0,4,7,6,5,8};
InitList(A);
for(i=3; i>=0; i--)
ListInsert(A, 1, a[i]);
InitList(B);
for(i=5; i>=0; i--)
ListInsert(B, 1, b[i]);
Link(A, B);
printf("原来的A:");
for(int i=0;i<4;++i)
{
printf("%d ",a[i]);
}
printf("\n原来的B:");
for(int i=0;i<6;++i)
{
printf("%d ",b[i]);
}
printf("\n把B连接到A后:");
DispList(A);
DestroyList(A);
return 0;
}
运行结果:
3、设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年11月2日
*版本号:v1.0
*
*问题描述:判断单链表L是否是递增的。
*输入描述:无。
*输出描述:输出是否递增。
*/
#include "LinkList.h"
#include<stdio.h>
bool increase(LinkList *L)
{
LinkList *q=L->next,*p=q->next;
if(q==NULL)
return true;
while(p!=NULL)
{
if(q->data<=p->data)
{
q=p;
p=q->next;
}
else return false;
}
return true;
}
int main()
{
LinkList *A, *B;
int i;
ElemType a[]= {1, 3, 2, 9};
ElemType b[]= {0, 4, 5 ,6, 7, 8};
InitList(A);
for(i=3; i>=0; i--)
ListInsert(A, 1, a[i]);
InitList(B);
for(i=5; i>=0; i--)
ListInsert(B, 1, b[i]);
printf("A:");
for(int i=0;i<4;++i)
{
printf("%d ",a[i]);
}
printf("\nB:");
for(int i=0;i<6;++i)
{
printf("%d ",b[i]);
}
printf("\nA: %c\n", increase(A)?'Y':'N');
printf("B: %c\n", increase(B)?'Y':'N');
DestroyList(A);
DestroyList(B);
return 0;
}
运行结果:
/* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2015年11月2日 *版本号:v1.0 * *问题描述:将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。 *输入描述:无。 *输出描述:输出结点逆置后的链表。 */ #include "LinkList.h" #include<stdio.h> void Reverse(LinkList *&L) { LinkList *p=L->next,*q; L->next=NULL; while(p!=NULL) { q=p->next; p->next=L->next; L->next=p; p=q; } } int main() { LinkList *L; ElemType a[]= {1,3,5,7, 2,4,8,10}; CreateListR(L,a,8); printf("L:"); DispList(L); Reverse(L); printf("逆置后L: "); DispList(L); DestroyList(L); return 0; }
运行结果:
2、已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年11月2日
*版本号:v1.0
*
*问题描述:已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,请设计算法将L2连接到L1的后面。
*输入描述:无。
*输出描述:输出连接后的链表。
*/
#include "LinkList.h"
#include<stdio.h>
void Link(LinkList *&L1, LinkList *&L2)
{
LinkList *p=L1;
while(p->next!=NULL)
{
p=p->next;
}
p->next=L2->next;
free(L2);
}
int main()
{
LinkList *A, *B;
int i;
ElemType a[]= {1,3,2,9};
ElemType b[]= {0,4,7,6,5,8};
InitList(A);
for(i=3; i>=0; i--)
ListInsert(A, 1, a[i]);
InitList(B);
for(i=5; i>=0; i--)
ListInsert(B, 1, b[i]);
Link(A, B);
printf("原来的A:");
for(int i=0;i<4;++i)
{
printf("%d ",a[i]);
}
printf("\n原来的B:");
for(int i=0;i<6;++i)
{
printf("%d ",b[i]);
}
printf("\n把B连接到A后:");
DispList(A);
DestroyList(A);
return 0;
}
运行结果:
3、设计一个算法,判断单链表L是否是递增的。实现这个算法,并完成测试。
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年11月2日
*版本号:v1.0
*
*问题描述:判断单链表L是否是递增的。
*输入描述:无。
*输出描述:输出是否递增。
*/
#include "LinkList.h"
#include<stdio.h>
bool increase(LinkList *L)
{
LinkList *q=L->next,*p=q->next;
if(q==NULL)
return true;
while(p!=NULL)
{
if(q->data<=p->data)
{
q=p;
p=q->next;
}
else return false;
}
return true;
}
int main()
{
LinkList *A, *B;
int i;
ElemType a[]= {1, 3, 2, 9};
ElemType b[]= {0, 4, 5 ,6, 7, 8};
InitList(A);
for(i=3; i>=0; i--)
ListInsert(A, 1, a[i]);
InitList(B);
for(i=5; i>=0; i--)
ListInsert(B, 1, b[i]);
printf("A:");
for(int i=0;i<4;++i)
{
printf("%d ",a[i]);
}
printf("\nB:");
for(int i=0;i<6;++i)
{
printf("%d ",b[i]);
}
printf("\nA: %c\n", increase(A)?'Y':'N');
printf("B: %c\n", increase(B)?'Y':'N');
DestroyList(A);
DestroyList(B);
return 0;
}
运行结果:
相关文章推荐
- 《C++并发编程实战》读书笔记4---并发数据结构queue
- 实现超大整数(超过long长度范围)的加法运算
- 多项式相加
- 数据结构实验2(设计哈弗曼编码和译码系统)
- Unity3D中常用的数据结构总结与分析
- JSON数据结构解析
- 解析概念及两种数据结构
- 常用数据结构
- redis数据结构_codepython整理一
- 树---判断两棵树是否相等
- LeetCode Binary Tree Postorder Traversal(数据结构)
- POJ 1743 Musical Theme (后缀数组)
- 数据结构基础4:串
- Lua1.0 数据结构
- 数据结构例程——图的遍历
- 数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)
- 数据结构-stack-学习笔记
- 数据结构例程——图的邻接矩阵存储结构及算法
- SPOJ 705 New Distinct Substrings (后缀数组)
- Ural 1297 Palindrome (后缀数组)