数据结构实践——单链表逆置
2015-09-25 09:12
344 查看
* Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:linklist.h,linklist.cpp,main.cpp * 作者:唐子健* 完成日期:2015年9月25日 * 版本号:vc++6.0 * * 问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据为 a1。实现这个算法,并完成测试。 * 输入描述:无 * 程序输出:逆置以后的结果。 */ #include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode //定义单链表结点类型 { ElemType data; struct LNode *next; //指向后继结点 }LinkList; void CreateListR(LinkList *&L,ElemType a[],int n); void InitList(LinkList *&L); //初始化线性表 void DestroyList(LinkList *&L); //销毁线性表 bool ListEmpty(LinkList *L); //判断线性表是否为空 void DispList(LinkList *L); //输出线性表 bool ListInsert(LinkList *&L,int i,ElemType e); //插入数据元素 void Reverse(LinkList *&L);
#include "linklist.h" 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); } void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\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; } } 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指向下一个结点 } }
#include "linklist.h" 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; }
相关文章推荐
- THU数据结构编程作业一:祖玛(Zuma)
- 项目6 -- 多项式求和
- 项目5 -- 猴子选大王
- 第3周SHH数据结构—【项目4-顺序表应用问题(2)】
- 第3周SHH数据结构—【项目4-顺序表应用问题(1)】
- 数据结构实践——建设单链表算法库
- 数据结构与算法分析:哈希表
- 数据结构和算法
- Java数据结构与算法之2的n次方判定
- Java数据结构与算法之年龄判断
- THU数据结构编程作业一:查询范围(Range)
- C语言中结构体与指针的若干问题(在数据结构中的应用)
- 数据结构 —— 第一个程序 【顺序表】
- 数据结构分析之线性哈希表(Linear Hash Tables)
- OpenCV CvMat数据结构参数
- 一步一步写平衡二叉树(AVL树)
- 基本数据结构:二叉树(binary tree)
- 基本数据结构:树(tree)
- 《大话数据结构》之静态链表
- 《大话数据结构》之单链表