数据结构实验二 单链表的定义及检索、插入、删除等算法的实现

学习目标:

实现单链表完成线性表的基本操作:
初始化线性表、清空线性表、求线性表长度、检查线性表是否为空、遍历线性表、从线性表中查找元素、从线性表中查找与给定元素值相同的元素在线性表中的位置、插入元素、删除元素。


学习要求:

用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;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值