学习目标:
实现单链表完成线性表的基本操作:
初始化线性表、清空线性表、求线性表长度、检查线性表是否为空、遍历线性表、从线性表中查找元素、从线性表中查找与给定元素值相同的元素在线性表中的位置、插入元素、删除元素。
学习要求:
用c++模板类定义单链表,并写出上述各个基本操作的模板函数,作为其方法;
调用“初始化”,实例化一个类型为整数的单链表,调用“是否空”输出其是否为空;
提示输入个数n,用0~99的n个随机整数,调用“插入”来依次添加单链表的0~n-1位序的数据元素;
调用“求长度”输出单链表长度,调用“是否空”输出其是否为空,调用“遍历”输出单链表的所有数据元素;
提示输入一个数值value,并调用“查找”,输出该数值在单链表中的位置;
提示输入位序i及一个数值value,调用“插入”将该数值插入单链表中,并调用“遍历”输入该新的单链表;
提示输入为位序i,调用“删除”将该数值从单链表中删除,并调用“遍历”输入该新的单链表;
调用“清空”,清空单链表,然后调用“求长度”输出其长度,调用“是否空”输出其是否为空。
实验原题:
单链表的定义及检索、插入、删除等算法的实现;(2学时)
实现单链表完成线性表的基本操作:
初始化线性表、清空线性表、求线性表长度、检查线性表是否为空、遍历线性表、从线性表中查找元素、从线性表中查找与给定元素值相同的元素在线性表中的位置、插入元素、删除元素。
【要求】:
用c++模板类定义单链表,并写出上述各个基本操作的模板函数,作为其方法;
调用“初始化”,实例化一个类型为整数的单链表,调用“是否空”输出其是否为空;
提示输入个数n,用0~99的n个随机整数,调用“插入”来依次添加单链表的0~n-1位序的数据元素;
调用“求长度”输出单链表长度,调用“是否空”输出其是否为空,调用“遍历”输出单链表的所有数据元素;
提示输入一个数值value,并调用“查找”,输出该数值在单链表中的位置;
提示输入位序i及一个数值value,调用“插入”将该数值插入单链表中,并调用“遍历”输入该新的单链表;
提示输入为位序i,调用“删除”将该数值从单链表中删除,并调用“遍历”输入该新的单链表;
调用“清空”,清空单链表,然后调用“求长度”输出其长度,调用“是否空”输出其是否为空。
代码:
#include<iostream>
using namespace std;
typedef struct Node
{
int data; //数据域
Node* next;//指针域 指针域是用来存放下一个节点的
}Lnode, * Linklist;
void Init_list(Linklist& L)//初始化操作
{
L = new Lnode;//创建头结点
L->next = NULL;
cout << "单向链表初始化完成!" << endl;
}
int ListEmpty(Linklist L){ //判断是否为空
if(L->next){
return 0;
}
else{
return 1;
}
}
void Input_data_Tail(Linklist& L, int n)
{
Lnode* p;//创建下一个节点
Lnode* r;//辅助指针用于指向下一个节点
r = L;//指向头结点
cout << "请开始输入元素:";
for (int i = 1; i <= n; i++)
{
p = new Lnode;
cin >> p->data;
r->next = p;//新创的p结点 连接在r后
r = p;//把r的结点更新为p
}
r->next = NULL;//并且最后要有NULL为结束符
}
int Getlength(Linklist& L)
{
Lnode* P;
P = L->next;//辅助指针指向当前结点的next指针
int count = 0;//记录当前操作了多少次next的次数
while (P != NULL)//当这个结点不走到结束标志也就是NULL就一直next
{
count++;
P = P->next;
}
return count;
}
void Insert_list(int i, Linklist &L)
{
Lnode* p;//辅助指针
Lnode* r;//创建新的结点了(也就是一会要插入的结点)
p = L;//辅助指针指向表头
int value;
cout << "请输入你要插入的数据";
cin >> value;
int count = 0;//找位置,找到要插入的位置
while (p->next != NULL && count < i - 1)
{
p = p->next;
count++;
}
r = new Lnode;//开创新结点内存
r->data = value;//把值传进去
r->next = p->next;
p->next = r;
}
void Delete_list(Linklist& L, int i)
{
Lnode* P;
Lnode* r;
P = L;//指向表头
int count = 0;//找位置的操作
while (P->next != NULL && count < i - 1)
{
P = P->next;//一直next直到找到输入的位置
count++;
}
r = P->next;//下一个结点覆盖当前结点
P->next = r->next;//并且把下下一个结点连接起来
delete r;//然后删除找到的那结点
}
int Findlist_value(Linklist &L, int value)
{
Lnode* p = L->next;
while (p != NULL)
{
if (p->data == value)
return 1;
p = p->next;//连接当前结点的NULL;
}
return 0;
}
void Show_list(Linklist L)
{
Lnode* p;
p = L->next; //先从L的null出发
cout << "单链表内容:"<<endl;
while (p != NULL)
{
cout << p->data<<" "; //连接第一个数据
p = p->next; //连接当前结点的NULL 然后一直循环
}
cout<<endl;
}
void Clearlist(Linklist &L){
Lnode *p,*q;
p=L->next;
while(p){
q=p->next;
delete p;
p=q;
}
L->next=NULL;
}
void menu()
{
cout << "=======================" << endl;
cout << "1.线表是否为空" << endl;
cout << "2.添加元素" << endl;
cout << "3.查询链表长度,判断是否为空,遍历输出" << endl;
cout << "4.查找,并输出在单链表的位置" << endl;
cout << "5.增加数据,并遍历" << endl;
cout << "6.删除某个位序的值,并遍历" << endl;
cout << "7.清空链表,输出长度,判断是否为空" << endl;
cout << "=======================" << endl;
}
int main()
{
menu();
Linklist L;
Init_list(L);
int select=0;
while(1)
{
cout << "请输入您要选择的操作:";
cin >> select;
switch (select)
{
case 1:
if(ListEmpty(L)==1){
cout<< "线表为空"<<endl;
}else{
cout<<"线表不为空"<<endl;
}
break;
case 2:
int n;
cout << "请输入个数n(0-99):";
cin >> n;
Input_data_Tail(L, n);
break;
case 3:
cout << "链表的长度为:" << Getlength(L) << endl;
if(ListEmpty(L)==1){
cout<< "线表为空"<<endl;
}else{
cout<<"线表不为空"<<endl;
}
Show_list(L);
cout << endl;
break;
case 4:
cout << "请输入您要查找的值";
int value;
cin >> value;
if (Findlist_value(L, value))
cout << "链表里找到了" << value << "这个值" << endl;
else
cout << "链表里没有找到这个值" << endl;
break;
case 5:
cout << "请输入您要插入的位置:"<<endl;
cin >> value;
Insert_list(value, L);
Show_list(L);
break;
case 6:
cout << "请输入您要删除哪个节点的数:"<<endl;
cin >> value;
Delete_list(L, value);
cout << "删除成功" << endl;
Show_list(L);
break;
case 7:
Clearlist(L);
cout << "链表的长度为:" << Getlength(L) << endl;
if(ListEmpty(L)==1){
cout<< "线表为空"<<endl;
}else{
cout<<"线表不为空"<<endl;
}
break;
}
}
return 0;
}