实验3、单链表的基本操作实现
(1)实验目的
通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。和实验3对比,掌握线性结构两种不同存储方式的区别。
(2)实验内容
编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。注意,每个功能模块一定要考虑非法的情况,并作出相应的提示,例如:求前驱,要分别能够测试第一个元素的前驱、其他正常的元素的前驱、输入一个在表中不存在的元素求其前驱,这三种情况应给出相应的提示语和结果值;插入和删除时要考虑插入或删除的位置是否合法等。
(3)实验要求:
菜单项包括:
1.初始化或重置链表
2.销毁链表
3.清空链表
4.链表长度
5.指定位置的元素值
6.链表已存在元素的位序
7.求输入元素的直接前驱
8.求输入元素的直接后继
9.在第i个位置插入一个元素
10.删除第i个元素
11.输出有的链表元素
12.初始化并用头插法(或尾插法)输入元素
13.实现单链表的逆序存放
要求:
所有的提示语和输出语句不允许出现在自定义的函数中,只能在main函数中出现提示语。
注:销毁链表时需要循环释放每个结点所占用的空间。
注:求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值。
效果图
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//--------------线性表的链式存储表示---------------
typedef int status; //status是函数的类型,其值是函数结果状态代码。
typedef int Elem; //自定
/*
data:数据域
*next:指针域
*/
typedef struct LNode{
Elem data;
struct LNode *next;
}LNode, *Link;
//---------------基本操作的函数原型说明------------
status InitList (Link &L);
//初始化或重置链表L
status DestroyList (Link &L);
//销毁链表
status ClearList(Link &L);
//清空链表
//status ListEmpty(Link L);
status ListLength(Link L);
//链表长度
status GetElem(Link L,int i,Elem &e);
//指定位置的元素值
status LocateElem(Link L,Elem e,int &locate);
//链表已存在元素的位序
status PriorElem(Link L,Elem cur_e,Elem &pre_e);
//求输入元素的直接前驱
status NextElem (Link L,Elem cur_e,Elem &next_e);
//求输入元素的直接后继
status ListInsert(Link &L,int i,Elem e);
//在第i个位置插入一个元素
status ListDelete(Link &L,int i,Elem &e);
//删除第i个元素
status HeadInsert(Link &M);
//头插
status Reorder(Link M,Link &N);
//元素逆序存放
//---------------主函数----------------------------
int main (){
int i = 0;
Elem e = 0,pre_e = 0,next_e = 0;
int locate = 0;
Link L = NULL; //头节点
Link N = NULL;
Link M = NULL;
int choice = 0;
while (1){
//菜单
printf("\t\t\t 1---初始化一个链表\n");
printf("\t\t\t 2---销毁链表\n");
printf("\t\t\t 3---清空链表\n");
printf("\t\t\t 4---求链表长度\n");
printf("\t\t\t 5---获取指定位置的元素\n");
printf("\t\t\t 6---获取指定元素的位置\n");
printf("\t\t\t 7---求前驱\n");
printf("\t\t\t 8---求后继\n");
printf("\t\t\t 9---在指定位置插入元素\n");
printf("\t\t\t 10--删除指定位置元素\n");
printf("\t\t\t 11--输出所有元素\n");
printf("\t\t\t 12--初始化并用头插法插入元素\n");
printf("\t\t\t 13--实现单链表的逆序存放\n");
printf("\t\t\t 退出,输入一个负数!");
printf("\n");
printf("\t\t----------------------------------------------\n");
printf("\n");
printf("请输入你需要的操作:\n");
//退出
scanf("%d",&choice);
if(choice<=0){
printf("已退出\n");
return 0;
}
switch (choice){
case 1:
if(L){
printf("链表已存在,不可重复初始化!\n");
}else{
//初始化
i = InitList(L);
if(i==1){
printf("初始化链表成功\n");<