单链表的实现

单链表的实现

/*
	功能:实现链表的增删改查
	版本:1.0
	时间:2019年3月17日
*/
#include<iostream>
#include<Windows.h>
using namespace std;

//定义一个链表的结构体
typedef struct listnode {
	int data = 0;
	listnode *next = nullptr;
}listnode, *linklist;

//链表的初始化
bool initlist(linklist &head) {
	head = new listnode;
	if (!head)return false;
	head->next = nullptr;
	return true;
}

//链表的创建——前插法
void createf(linklist &head) {
	head = new listnode;
	//对用户进行友好提示,提示输入
	cout << "请输入你所想要创建链表元素的个数:";
	int  count;									//count存储元素个数
	cin >> count;								//输入count的值
	cout << "请依次输入各个元素,元素之间用空格隔开:";
	//创建临时变量用来存储数据
	linklist temp;
	//循环输入各个数据
	while (count--) {
		temp = new listnode;
		//输入元素
		cin >> temp->data;
		//判断head->next是否为空
		if (!head->next) {
			head->next = temp;
		}
		else {
			temp->next = head->next;
			head->next = temp;
		}
	}
	cout << "前插法创建链表成功!" << endl;
}

//链表的创建——后插法
void createb(linklist &head) {
	head = new listnode;
	head->next = nullptr;
	//对用户进行友好提示,提示输入
	cout << "请输入你所想要创建链表元素的个数:";
	int  count;									//count存储元素个数
	cin >> count;								//输入count的值
	cout << "请依次输入各个元素,元素之间用空格隔开:";
	//创建临时变量用来存储数据
	linklist temp, tail;
	//创建的尾指针刚开始指向head指针
	tail = head;
	//循环输入各个数据
	while (count--) {
		temp = new listnode;
		//输入元素
		cin >> temp->data;
		tail->next = temp;
		temp->next = nullptr;
		tail = temp;
	}
	cout << "后插法创建链表成功!" << endl;
}

//链表元素的增加
void addelement(linklist &head) {
	//设置一个cur
	linklist cur;
	cur = head;
	//新增加的元素在原链表中的位置
	int n;
	cout << "请输入增加元素在该链表中的位置:";
	cin >> n;
	n--;
	//循环找到当前位置的元素
	while (n--) {
		cur = cur->next;
	}
	//创建一个临时变量
	linklist temp;
	temp = new listnode;
	cout << "请输入你所想要增加的元素:";
	cin >> temp->data;
	temp->next = cur->next;
	cur->next = temp;
	cout << "添加成功!" << endl;
}


//链表元素的删除
void delelement(linklist &head) {
	//设置一个cur
	linklist cur;
	cur = head;
	//删除的元素在原链表中的位置
	int n;
	cout << "请输入删除元素在该链表中的位置:";
	cin >> n;
	n--;
	//循环找到当前位置的元素
	while (n--) {
		cur = cur->next;
	}
	//设置一个临时变量存储删除的数据
	linklist temp;
	temp = cur->next;
	cur->next = cur->next->next;
	delete temp;
	cout << "删除成功!" << endl;
}


//链表元素的更改
void change(linklist &head) {
	//设置一个cur
	linklist cur;
	cur = head;
	//删除的元素在原链表中的位置
	int n;
	cout << "请输入所要更改元素在该链表中的位置:";
	cin >> n;
	n--;
	//循环找到当前位置的元素
	while (n--) {
		cur = cur->next;
	}
	//提示用户输入想要更改的数据
	int num;
	cout << "请输入你所想要更改成的数字:";
	cin >> num;
	cur->next->data = num;
	cout << "更改成功!"<<endl;
}

//显示(遍历)链表中的各个元素
void travel(linklist &head) {
	linklist cur;			//cur代替head
	cur = head;
	if (cur->next == nullptr) {
		cout << "当前链表为空!" << endl;
	}
	else {
		cur = cur->next;
		while (cur) {
			cout << cur->data << " ";
			cur = cur->next;
		}
	}
}

//显示界面
void show() {
	cout << "1.链表初始化" << endl;
	cout << "2.前插法创建一个新链表" << endl;
	cout << "3.后插法创建一个新的链表" << endl;
	cout << "4.链表元素的增加" << endl;
	cout << "5.链表元素的删除" << endl;
	cout << "6.改变当前链表中的元素" << endl;
	cout << "7.查看当前链表中元素" << endl;
	cout << "8.退出" << endl;
}

int main() {
	linklist head;
	int n = 0;
	while (n!=8) {
		show();
		cout << "请选择你所想要的进行的操作:";
		cin >> n;
		switch (n) {
		case 1:
			initlist(head);
			break;
		case 2:
			createf(head);
			break;
		case 3:
			createb(head);
			break;
		case 4:
			addelement(head);
			break;
		case 5:
			delelement(head);
			break;
		case 6:
			change(head);
			break;
		case 7:
			travel(head);
			break;
		case 8:
			cout << "您已退出!" << endl;
			break;
		default:
			cerr << "输入错误,请重新输入!" << endl;
		}
		Sleep(1000);		//显示一秒
		system("cls");		//清屏
	}
	system("pause");
	return 0;
}

单链表的实现
源码中可能有错误,请见谅!