赞
踩
- /*
- * Copyright (c) 2015, 烟台大学计算机与控制工程学院
- * All rights reserved.
- * 文件名称: linklist.cpp,main.cpp,linklist.h
- * 作者:巩凯强
- * 完成日期:2015年9月22日
- * 版本号: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;
- }
运行结果:
知识点总结:
先采用右插法将数插入,调用Reverse()函数置换,主要代码为q=p->next; p->next=L->next; L->next=p; p=q;
学习心得:
又学会了逆置的算法,慢慢积累。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。