数据结构 C语言版
实验3 单链表的基本操作实现
(1)实验目的
通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。和实验3对比,掌握线性结构两种不同存储方式的区别。
(2)实验内容
编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。注意,每个功能模块一定要考虑非法的情况,并作出相应的提示,例如:求前驱,要分别能够测试第一个元素的前驱、其他正常的元素的前驱、输入一个在表中不存在的元素求其前驱,这三种情况应给出相应的提示语和结果值;插入和删除时要考虑插入或删除的位置是否合法等。
(3)实验要求:
菜单项包括:
1.初始化或重置链表
2.销毁链表
3.清空链表
4.链表长度
5.指定位置的元素值
6.链表已存在元素的位序
7.求输入元素的直接前驱
8.求输入元素的直接后继
9.在第i个位置插入一个元素
10.删除第i个元素
11.输出有的链表元素
12.初始化并用头插法(或尾插法)输入元素
13.实现单链表的逆序存放
要求:所有的提示语和输出语句不允许出现在自定义的函数中,只能在main函数中出现提示语。
注:销毁链表时需要循环释放每个结点所占用的空间。
注:求前驱是指,输入一个元素值(而不是位置),求该元素在顺序表中的直接前驱元素值。求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值。
(4)验收/测试用例
*参考实验二*
主要源代码
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int flag=0;
int len,a[100];
typedef struct Lnode {
int data;
struct Lnode *next;
} Lnode, *Linklist;
void InitList (Linklist *L) {
//初始化一个空的链表
//二级指针的目的是地址传递,因为该函数没有返回值,用地址传递带回头节点地址。
Linklist p;
p = (Linklist)malloc(sizeof(Lnode));
if(p == NULL)
cout << "申请内存空间失败。" << endl;
p->next=NULL;
*L = p;
flag=1;
}
int DestroyList(Linklist L) {
//销毁链表
Lnode *p;
p=NULL;
if(L && flag!=0) {
while(L!=NULL) {
p=L->next;
free(p);
L=L->next;
}
cout << "链表已销毁。" << endl;
} else
cout << "链表不存在。" << endl;
return 1;
}
int List_empty(Linklist L,int just) {
//清空链表
if(just!=0) {
while(L->next!=NULL) {
Linklist t;
t=L->next;
L->next=t->next;
free(t);
}
cout<<"链表已清空"<<endl;
} else {
cout<<"链表不存在。"<<endl;
}
return 1;
}
void ListLength(Linklist L) {
//输出链表的长度.
int i=0;
Linklist p;
p=L;
while(p->next!=NULL) {
i++;
p=p->next;
}
cout << "链表中共有" << i << "个元素。" << endl;
}
void Creatlist(Linklist L,int n) {
//创建链表
int i;
Lnode *p,*pt;
pt=L;
for(i=1; i<=n; i++) {
p=(Linklist)malloc(sizeof(Lnode));