数据结构:单链表的基本操作实现

本文介绍了如何使用C语言和C++编程实现单链表的基本操作,包括初始化、销毁、清空链表、求链表长度、插入、删除、查找元素及其前驱和后继。实验要求包含13个菜单选项,强调非法操作的处理和内存管理,特别是销毁链表时要释放所有节点。此外,求前驱和后继是根据元素值而非位置进行的。
摘要由CSDN通过智能技术生成

实验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");<
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值