C、数据结构
目录
一、实验目的
1、理解单链表的结构特点。
2、掌握单链表的基本操作。
二、实验内容
2、将一个带头结点单链表就地逆置
程序编制上的提示,仅供参考(其中很多代码可以借鉴实验内容1):
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList createList (LinkList L,int n){
//创建一个含有n个结点的带头结点的单链表
……
return L;
}
void showList (LinkList L){
//能够输出带头结点的单链表L中的各个结点的值
……
}
void reverse_L(LinkList L){
//将一个带头结点单链表L就地逆置
……
}
main() {
LinkList L=NULL;
L=createList(L,6);
showList (L);
reverse_L (L);
printf(“\n 逆置后的结果是:\n”);
showList (L);
}
注:程序运行时如输入(假设采用头插法创建的链表):6 5 4 3 2 1,
输出结果如下: 1 2 3 4 5 6
逆置后的结果是:6 5 4 3 2 1
三、源代码
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;//声明
LinkList createList(LinkList L,int n){//尾插法
int i;
LinkList p,q;
L=(LinkList) malloc (sizeof(LNode));
L->next=NULL;
q=L;
for(i=1;i<=n;i++){
p=(LinkList) malloc (sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL;
return L;
}
void showList(LinkList L){//输出带头结点的单链表L中各个结点的值,不包括头结点
LinkList p;
p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void reverse_L(LinkList L){//将带头结点的单链表L就地逆置
LinkList p,q,r;
p=L->next;
q=p->next;
p->next=NULL;
while(q){
//printf("%d",p->next);
L->next=q;
r=q->next;
q->next=p;
p=L->next;
q=r;
}
}
void main(){
LinkList La=NULL;
La=createList(La,5);//创建带头结点单链表La,如果需要La递增,注意自己录入数据的次序
showList(La);//显示带头结点单链表La中各个结点的值
//可以用类似的方法创建带头结点的单链表Lb
reverse_L(La);//释放La中的各个结点(包括头结点)
showList(La);
}
四、运行结果

五、实验小结
1.在编写程序的过程中要静心思考,配合画图,更加直观形象地找出问题或理解程序。
2.在程序中做出了很多批注,帮助理解。
与上次试验的程序作比较,理解结构体类型带指针定义与不带的区别。
//LNode是结构体类型名,*LinkList是指向结构体的普通指针,相当于LNode *LinkList这样的定义,LNode *p中p是结构体指针,非普通指针,LinkList p中p是普通指针,指向LNode类型结构体的指针.
4.在输入或者书写代码时注意大小写的区分,养成规范良好的习惯,上下文保持一致,多注意上文所定义的函数名。
本文含有隐藏内容,请 开通VIP 后查看