/*
Copyright (c)2016,烟台大学计算机与控制工程学院
All rights reserved.
文件名称:项目3--单链表应用(1).cpp
作 者:李潇
完成日期:2016年9月18日
版 本 号:v1.0
问题描述:1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,
即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。
输入描述:若干数据 。
程序输出:链表中的数据及逆序拍好后的数据。
*/
//主函数main.cpp的代码
#include<iostream>
using namespace std;
#include<stdio.h>
#include"list.h"
int main()
{
LinkList *L;
ElemType a[8]= {1,3,4,6,8,9,10,7};
CreateListR(L,a,8);
printf("L:");
DispList(L);
Reverse(L);
printf("逆置后L: ");
DispList(L);
DestroyList(L);
return 0;
}
//头文件list.h的代码
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;//int类型 运用typedef方便快捷
typedef struct LNode
{
ElemType data;
struct LNode *next;//定义单链表节点类型
}LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void DispList(LinkList *L);//输出线性表
void DestroyList(LinkList *&L); //销毁线性表
void Reverse(LinkList *l);
#endif // LIST_H_INCLUDED
//函数实现list.cpp的代码
#include"list.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]; //创建数据结点*s
r->next=s; //将*s插入*r之后
r=s;
}
r->next=NULL; //终端结点next域置为NULL
}
void DispList(LinkList *L)//输出线性表
{
LinkList *p=L->next;//p指向开始节点
while (p!=NULL)//p不为NULL,输出*p节点的data域
{
printf("%d ",p->data);
p=p->next;//p移向下一个节点
}
printf("\n");
}
void DestroyList(LinkList *&L) //销毁线性表
{
LinkList *pre=L,*p=L->next;//pre指向*p的前驱节点
while (p!=NULL)//扫描单链表L
{
free(pre);//释放*pre节点
pre=p; //pre 、p同步后移一个单位
p=pre->next;
}
free(pre);//循环结束后,p为NULL,pre指向尾节点,释放它
}
void Reverse(LinkList *l)
{
LinkList *p,*q;
p=l->next;
l->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=l->next;
l->next=p;
p=q;
}
}
运行结果:
<img src="https://img-blog.youkuaiyun.com/20160918162236157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:根据头插法尾差法的特点完成链表逆载
心得体会:加深了对单链表的尾差法和头插法的理解和应用