第四周项目3--单链表应用之逆置
/*
烟台大学计算机与控制工程学院
作 者:孙潇
完成日期:2015年10月9日
问题描述:已知L1和L2分别指向两个单链表的头结点,且已知其长度分别为m、n,
请设计算法将L2连接到L1的后面。实现这个算法,完成测试,并分析这个算法的复杂度。
输入描述:若干数据 。
程序输出:链表合并后的数据。
*/
程序中利用了已经实现的单链表算法,头文件LinkList.h及其中函数的实现
头文件linklist.h
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
}LinkList;
void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void InitList(LinkList *&L); //初始化线性表
void DestroyList(LinkList *&L); //销毁线性表
bool ListEmpty(LinkList *L); //判断线性表是否为空
int ListLength(LinkList *L); //求线性表长度
void DispList(LinkList *L); //输出线性表
bool GetElem(LinkList *L,int i,ElemType &e); //求线性表某个数据元素值
int LocateElem(LinkList *L,ElemType e); //按元素值查找
bool ListInsert(LinkList *&L,int i,ElemType e); //插入数据元素
bool ListDelete(LinkList *&L,int i,ElemType &e); //删除数据元素
#endif // LINKLIST_H_INCLUDED
linklist.cpp
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表
{
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->next=NULL;
for (i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=a[i];
s->next=L->next; //将*s插在原开始结点之前,头结点之后
L->next=s;
}
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点
for (i=0; i<n; i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=a[i];
r->next=s; //将*s插入*r之后
r=s;
}
r->next=NULL; //终端结点next域置为NULL
}
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点
L->next=NULL;
}
void DestroyList(LinkList *&L)
{
LinkList *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p); //此时q为NULL,p指向尾结点,释放它
}
bool ListEmpty(LinkList *L)
{
return(L->next==NULL);
}
int ListLength(LinkList *L)
{
LinkList *p=L;
int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
void DispList(LinkList *L)
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0;
LinkList *p=L;
while (j<i && p!=NULL)
{
j++;
p=p->next;
}
if (p==NULL) //不存在第i个数据结点
return false;
else //存在第i个数据结点
{
e=p->data;
return true;
}
}
int LocateElem(LinkList *L,ElemType e)
{
LinkList *p=L->next;
int n=1;
while (p!=NULL && p->data!=e)
{
p=p->next;
n++;
}
if (p==NULL)
return(0);
else
return(n);
}
bool ListInsert(LinkList *&L,int i,ElemType e)
{
int j=0;
LinkList *p=L,*s;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s
s->data=e;
s->next=p->next; //将*s插入到*p之后
p->next=s;
return true;
}
}
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while (j<i-1 && p!=NULL) //查找第i-1个结点
{
j++;
p=p->next;
}
if (p==NULL) //未找到位序为i-1的结点
return false;
else //找到位序为i-1的结点*p
{
q=p->next; //q指向要删除的结点
if (q==NULL)
return false; //若不存在第i个结点,返回false
e=q->data;
p->next=q->next; //从单链表中删除*q结点
free(q); //释放*q结点
return true;
}
}
#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
void Reverse(LinkList *&L)
{
LinkList *p=L->next,*q;
L->next=NULL;
while (p!=NULL) //扫描所有的结点
{
q=p->next; //让q指向*p结点的下一个结点
p->next=L->next; //总是将*p结点作为第一个数据结点
L->next=p;
p=q; //让p指向下一个结点
}
}
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;
}
运行结果:
知识点总结:
单链表的所有结点逆置
学习心得:
学习要善于总结和应用
第四周项目3--单链表应用之逆置相关推荐
- 借助栈实现单链表的原地逆置
借助栈实现单链表的原地逆置 [问题描述]首先建立一个单链表,通过栈实现该链表的原地逆置,注意仅使用链表中的原有的结点空间,结点的数据成员为int型.注意这个题需要单链表和栈两个类. [输入形式]输入只 ...
- 【单链表】单链表的就地逆置
编写算法实现带头结点单链表seqlist的就地逆置,即利用原带头结点单链表seqlist的结点空间,把数据元素顺序排反 题目分析: 在前面2-18讲了顺序表的就地逆置,但单链表的就地逆置与顺序表有所不 ...
- java实现单链表就地逆置,单链表的就地逆置讲解
{ List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...
- c语言字符就地逆置,高手看看我的C语言代码单链表实现就地逆置
高手看看我的C语言代码单链表实现就地逆置 单链表实现就地逆置#include #include struct type{ int date; struct type * next;}first;int ...
- 对单链表实现就地逆置
对单链表实现就地逆置 /* 对单链表实现就地逆置 */ #include <stdio.h> #include "malloc.h"typedef struct LNo ...
- 对带头结点的单链表实现就地逆置的算法分析
试写一算法,对单链表实现就地逆置. 实现下列函数: void Inverse(LinkList &L); /* 对带头结点的单链表L实现就地逆置 */ 单链表类型定义如下: typedef ...
- 数据结构上机实践第四周项目3 - 单链表应用
[项目3 - 单链表应用] 算法的建立就是为了应用所服务的,学会方法,真正能应用才是王道. 应用要求如下: 完成下面的应用时,除项目中给出的特殊要求,其余工作均可利用项目2完成的算法支持. 1.设计 ...
- 单链表反转(逆置)——(四种方法实现)
链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个--依次类推,直到第一个到最后一个. 由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的 ...
- 第四周项目3单链表应用(2)
/* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目3(2).cpp *作 者:彭子竹 *完成日期:2015年10月1 ...
- 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)
前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题.今天说一下单链表就地反转. 本文从包含头节点和不包含头节点两种链表都提供了相应的就地反 ...
最新文章
- 在iOS端如何使用Charles用作http调试
- 项目: 双人反弹球游戏
- mysql 5.1.60.tar.gz_linux下安装mysql-5.1.51.tar.gz
- QT获取本地网络信息
- cocoapods Analyzing dependencies 问题的解决方案
- VMware竟然出了一款防火墙
- PHP即将退出,PHP4即将退出历史舞台
- Go语言开发设置代理Goproxy,提高Go安装模块速度
- 渐变颜色Qt学习:QPainter之渐变填充
- 华为能更新到鸿蒙的手机有哪些,荣耀哪些手机可以升级鸿蒙系统 荣耀鸿蒙系统支持的手机型号盘点...
- SAP License:Ecc6.0和R/3 有什么区别?
- LoadRunner11破解方法
- 大功率UWB模块 XZM3000 移植手册 《从DWM1000到XZM3000移植手册》
- 十大管理之项目进度管理知识点
- Android自定义日历控件
- IPv6篇之即插即用
- flex trace无法使用
- Android Studio中的 Image Asset Studio(图标生成工具)
- x的y次方python表达式怎么写_x 的 y 次方(xy) 以下表达式正确的是________
- 怎么配置java环境_idea配置java环境
热门文章
- 云栖大会开源重磅升级!PolarDB-X v2.2: 企业级和国产化适配
- 打造云原生大型分布式监控系统
- python爬虫捕鱼网站_古法捕鱼,千年绝技
- python搜索pdf内容所在页码_使用pyPDF从文档中检索页码
- 竞价推广(SEM)是什么
- 图像模式识别 (五)
- 【Git】error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was rece
- 什么是生物特征识别?有哪些生物特征?
- python入门基础三之流程控制
- 详解word2vec