问题及代码:
/*
*Copyright (c)2016,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:a.cbp
*作 者:房斐
*完成日期:2016年9月22日
*版 本 号:v1.0
*问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,
即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。
*输入描述:无
*程序输出:逆置后的单链表中的各节点
*/
main.cpp
#include <stdio.h>
#include "linklist.h"
int main()
{
LinkList *L;
ElemType a[8]= {1, 2, 5, 2, 0, 8, 6, 9};
CreateListR(L,a,8);
DispList(L);
Reverse(L);
DispList(L);
return 0;
}
LinkList.cpp
#include <stdio.h>
#include <malloc.h>
#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 DispList(LinkList *L)
{
LinkList *p=L->next;
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void Reverse(LinkList*&L)
{
LinkList *p,*q;
p=L->next;
L->next=NULL;
while (p!=NULL)
{
q=p->next; //q指向p节点的后继节点
p->next=L->next; //p节点作为第一个数据节点
L->next=p; //插入
p=q;
}
}
LinkList.h
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
}LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void DispList(LinkList *L); //输出线性表
void Reverse(LinkList*&L);
运行结果:
知识点总结:
逆置线性表。