单链表的基本操作
一、实验目的
1、理解和掌握单链表的类型定义方法和结点生成方法。
2、掌握建立单链表和显示单链表元素的算法。
3、掌握单链表的插入和删除算法。
二、实验内容
1、建立一个单链表,并从屏幕显示单链表元素列表。
2、删除链表某位置上的元素,并保持链表原有的顺序不变。
3、在指定的位置插入一个元素。
三、实验源代码
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;//数据域
struct LNode* next; //指针域
}LNode, * LinkList;
/*void CreateList_F(LinkList& L, int n)//头插
{
LinkList p;
int i;
L = new LNode;
L->next = NULL; //先建立一个带头结点的单链表
for (i = n; i > 0; --i) {
p = new LNode; //生成新结点
cin >> p->data; //输入元素值
p->next = L->next; L->next = p; //插入到表头
}
}//CreateList_F */
void CreateList_L(LinkList& L, int n) //尾插
{
int i;
LinkList r, p;
//正位序输入n个元素的值,建立带表头结点的单链表L
L = new LNode;
L->next = NULL;
r = L; //尾指针r指向头结点
for (i = 0; i < n; ++i) {
p = new LNode; //生成新结点
cin >> p->data; //输入元素值
p->next = NULL; r->next = p; //插入到表尾
r = p; //r指向新的尾结点
}
}//CreateList_L
int GetElem_L(LinkList L, int i, ElemType& e) //取值
{
LinkList p;
p = L->next; int j = 1; //初始化
while (p && j < i)
{ //向后扫描,直到p指向第i个元素或p为空
p = p->next; ++j;
}
if (!p || j > i)exit(0); //第i个元素不存在
e = p->data; //取第i个元素
}//GetElem_L
Status ListInsert_L(LinkList& L, int i, ElemType e) {
int j;
LinkList s, p;
p = L; j = 0;
while (p && j < i - 1) { p = p->next; ++j; } //寻找第i−1个结点
if (!p || j > i - 1)return 0; //i大于表长 + 1或者小于1
s = new LNode; //生成新结点s
s->data = e; //将结点s的数据域置为e
s->next = p->next; //将结点s插入L中
p->next = s;
return 0;
}//ListInsert_L
Status ListDelete_L(LinkList& L, int i, ElemType& e) //删除
{
int j;
LinkList q, p;
p = L; j = 0;
while (p->next && j < i - 1) {//寻找第i个结点,并令p指向其前驱
p = p->next; ++j;
}
if (!(p->next) || j > i - 1) return 0; //删除位置不合理
q = p->next; //临时保存被删结点的地址以备释放
p->next = q->next; //改变删除结点前驱结点的指针域
e = q->data; //保存删除结点的数据域
delete q; //释放删除结点的空间
return 0;
}//ListDelete_L
void menu() //菜单函数
{
printf("----------------------\n");
printf("0.退出\n");
printf("1.插入\n");
printf("2.查找\n");
printf("3.删除\n");
printf("4.输出\n");
printf("----------------------\n");
}
void DispList(LinkList L)//输出线性表
{
L = L->next;
if (!L->next)
{
printf("空表\n");
}
printf("输出");
while (L != NULL)
{
printf("%d ", L->data); L = L->next;
}
}
int main() {
int input;
LinkList L;
int len, i, j, e, n, o, p;
printf("请输入元素个数:");
scanf_s("%d", &len);
printf("请输入元素:");
CreateList_L(L, len);
do
{
menu();
printf("请输入选项:");
scanf_s("%d", &input);
switch (input)
{
case 0:break;
case 1:
printf("请输入插入位置:");
scanf_s("%d", &i);
printf("请输入插入元素:");
scanf_s("%d", &e);
ListInsert_L(L, i, e);
DispList(L); printf("\n"); break;
case 2:printf("输入查找元素的位置:");
scanf_s("%d", &o);
GetElem_L(L, o, p);
printf("输出查找元素的值:%d", p); printf("\n"); break;
case 3:
printf("删除元素的位置:");
scanf_s("%d", &j);
ListDelete_L(L, j, n);
printf("删除元素的值:%d\n", n);
DispList(L);
printf("\n"); break;
case 4: DispList(L);
printf("\n"); break;
default:
break;
}
} while (input);
return 0;
}
四、实验结果
注:编译器visual stidio 2019