单链表基本操作Ⅱ

运行截图:

下面是完整代码:

#include <iostream>
#include <stdio.h>

using namespace std;

/*链表结构体定义*/
typedef int ElemType;
struct List {
	ElemType data;
	struct List* next;
};
typedef struct List* list;

/*初始化无头结点单链表*/
bool f_initialize(list& L) {
	L = NULL;
	return true;
}
/*判断无头结点链表是否为空*/
bool f_judge(list& L) {
	if (L == NULL) {
		return true;
	}
	else {
		return false;
	}
}

/*头插法*/
list f_headinsert(list& L) {
	L = (list)malloc(sizeof(List));
	L->next = NULL;
	ElemType x;
	cout << "\n输入节点数据,-1表示结束输入:\n";
	cin >> x;
	while (x != -1) {
		list p = (list)malloc(sizeof(List));
		p->data = x;
		p->next = L->next;
		L->next = p;
		cout << "输入节点数据\n";
		cin >> x;
	}
	return L;
}

/*尾插法*/

list f_endinsert(list& L) {
	L = (list)malloc(sizeof(List));
	L->next = NULL;
	list m = L;
	ElemType x;
	cout << "\n输入节点数据,-1表示结束输入:\n";
	cin >> x;
	while (x != -1) {
		list p = (list)malloc(sizeof(List));
		p->data = x;
		p->next = NULL;
		m->next = p;
		m = p;
		cout << "输入节点数据\n";
		cin >> x;
	}
	return L;
}

/*遍历链表*/
void fs_bl(list& L) {    //注意,遍历时一定不能用原指针,不然,遍历两次时,会因为指针报错
	list p = L;
	while (p->next != NULL) {
		cout << p->next->data << "->";
		p= p->next;
	}
	cout << "NULL"<<endl;
}

/*根据值删除*/
void value_delete(list& L, int k) {
	list p = L;
	while (p->next) {
		if (p->next->data == k) {
			list t = p->next;
			p->next = t->next;
			free(t);
		}
		p = p->next;
	}
}

/*根据位置删除*/
void position_delete(list& L, int k) {
	list p = L;
	if (p == NULL) {
		cout << "链表为空" << endl;
		return;
	}
	if (k < 0) {
		cout << "要删除的位置错误,数值应该>=0" << endl;
		return;
	}
	int i=0;
	while (p->next != NULL && i < k-1) {
		p = p->next;
		i++;
	}
	list t = p->next;
	p->next = p->next->next;
	free(t);
	//return L;
}

/*根据值查询*/
void value_find(list& L, int k) {
	list p = L->next;
	int i = 0;
	while (p) {
		i++;
		if (p->data == k) {
			cout << "值" << k << "在链表中的位置是:" << i << endl;
		}
		p = p->next;
	}
}

/*根据位置查询*/
void position_find(list& L, int k) {
	list p = L;
	if (k < 0) {
		cout << "要删除的位置错误,数值应该>=0" << endl;
		return;
	}
	int i = 0;
	while (p->next!=NULL && i<k){
		p = p->next;
		i++;
	}
	cout << "位置" << k << "在链表中的值是:" << p->data<<endl;
}

/*插入指定位置*/
void position_insert(list& L, int k) {
	ElemType x;
	list p = L;
	int i = 0;
	if (k < 0) {
		cout << "要删除的位置错误,数值应该>=0" << endl;
		return;
	}
	while (p->next != NULL && i < k-1) {
		p = p->next;
		i++;
	}
	list m = (list)malloc(sizeof(List));
	cout << "\n 输入新增节点的值:";
	cin >> x;
	m->data = x;
	m->next = p->next;
	p->next = m;
	//return L;
}

/*链表节点数*/
void len(list& L) {
	int i = 0;
	list p = L->next;
	while (p) {
		i++;
		p = p->next;
	}
	cout << "一共有" << i << "个节点\n";
}

int main() {
	list l;
	int n;
	ElemType m;
	f_initialize(l);
	l=f_headinsert(l);
	fs_bl(l);
	cout << endl;
	cout << "输入删除的节点位置:";
	cin >> n;
	position_delete(l, n);
	fs_bl(l);
	cout << endl;
	cout << "输入删除的节点值:";
	cin >> m;
	value_delete(l,m);
	fs_bl(l);
	cout << endl;
	cout << "输入查询的节点位置:";
	cin >> n;
	position_find(l, n);
	fs_bl(l);
	cout << endl;
	cout << "输入查询的节点值:";
	cin >> m;
	value_find(l, m);
	fs_bl(l);
	cout << endl;
	cout << "输入插入的节点位置:";
	cin >> n;
	position_insert(l, n);
	fs_bl(l);
	cout << endl;
	len(l);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓷瓷的可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值