单链表 Ultimate Edition

#include <iostream>
using namespace std;
#define OK 1;
#define ERROR 0;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

typedef int Status;
typedef int ElemType;

typedef struct LNode {//存储结构 
	ElemType data;//数据域 
	struct LNode* next;	//指针域 
}LNode, * LinkList;/*LinkList是指向LNode结构体的指针类型,可以通过这个指针类型定义LNode这个结构体的表 */

Status InitList(LinkList& L);//初始化

void CreateList_H(LinkList& L, int n);//头插法创建单链表
void CreateList_R(LinkList& L, int n);//后插法创建单链表 

void TraverseList(LinkList L);//遍历单链表 
void Connect(LinkList& L, LinkList& Q,LinkList& C);//合并单链表 有删
void Connect2(LinkList& L, LinkList& Q, LinkList& C);//合并单链表 保留
Status GetElem(LinkList L, int i, ElemType& e);//按位查找值 
int LocateElem(LinkList L, ElemType);//按值查找地址 
Status ListInsert(LinkList& L, int i, ElemType e);//单个数据插入 
Status ListDelete(LinkList& L, int i);//删除第i个数据 

int main(int argc, char** argv) {
	LinkList L;
	LinkList Q;
	LinkList C;
	int n, i, choice = 1;
	ElemType e, value;
	InitList(L);
	cout <<"《第三次作业(关于单链表的练习)》"<<endl
		<<"					"<<endl
		<< "输入对应序号使用功能:" << endl
		<< "①.创建链表" << endl
		<< "②.遍历链表" << endl
		<< "③.按位查询" << endl
		<< "④.按值查询" << endl
		<< "⑤.按位插入" << endl
		<< "⑥.按位删除" << endl
		<< "⑦.合并链表(重复有删除)" << endl
		<< "⑧.合并链表(重复无删除)" << endl
		<< "<0>.退出" << endl
		<< "--------------------" << endl;
	while (choice) {
		cout << "请输入你要进行的操作:\t";
		cin >> choice;
		if (choice > 8)cout << "Sorry,your input is wrong!" << endl;
		switch (choice) {

		case 1://后插法创建单链表 
			cout << "你想创建单链表的表长为:";
			cin >> n;
			CreateList_R(L, n);
			break;

		case 2://遍历 
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			TraverseList(L);
			break;

		case 3://按位查询 
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "你想查询的位置i是:";
			cin >> i;
			if (GetElem(L, i, e))
				cout << "它的位置是:" << e << endl;
			else
				cout << "查询失败!" <<endl;
			break;

		case 4://按值查询 
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "你想查询的值为:";
			cin >> value;
			if (LocateElem(L, value))

				cout << "它的位置是:" << LocateElem(L, value) << endl;

			else
				cout << "查找不到" << endl;
			break;

		case 5://插入 
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "你想插入的位置和数字是:";
			cin >> i >> e;
			if (ListInsert(L, i, e))cout << "插入成功!";
			else cout << "输入位置不合法!";
			break;

		case 6://删除
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "你想删除的位置i是:";
			cin >> i;
			if (ListDelete(L, i))
				cout << "删除成功!" << endl;
			else 
				cout << "删除失败,删除位置不合法!";
			break;
		case 7://合并 有删
			
			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "请输入第二个单链表的表长" << endl;
			cin >> n;
			CreateList_R(Q, n);
			Connect(L,Q,C);
			cout << endl ;
			break;

		case 8://合并 有删

			if (!L->next) {
				cout << "还未创建单链表,查询失败!" << endl;
				break;
			}
			cout << "请输入第二个单链表的表长" << endl;
			cin >> n;
			CreateList_R(Q, n);
			Connect2(L, Q, C);
			cout << endl;
			break;

		case 0:
			cout << "结束!" << endl;
			return 0;
		}
	}
	return 0;
}

Status InitList(LinkList& L) {
	L = new LNode;
	L->next = NULL;
	return 1;
}
Status InitList2(LinkList& Q) {
	Q = new LNode;
	Q->next = NULL;
	return 1;
}

void CreateList_H(LinkList& L, int n) {

	L = new LNode;
	L->next = NULL;
	for (int i = 0; i < n; i++) {
		LinkList p;
		p = new LNode;
		cout << "请输入第" << n - i << "个数为:";
		cin >> p->data;
		p->next = L->next;
		L->next = p;
	}
	cout << "前插法创建成功!" << endl;
}

void CreateList_R(LinkList& L, int n) {
	L = new LNode;
	L->next = NULL;
	LinkList p, r;
	r = L;
	for (int i = 0; i < n; i++) {
		p = new LNode;
		cout << "请输入第" << i + 1 << "个数为:";
		cin >> p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
	cout << "创建成功!" << endl;
}



void TraverseList(LinkList L) {
	LinkList p;
	p = L;
	cout << "遍历结果:";
	while (p->next != NULL) {
		p = p->next;
		cout << p->data << "  ";
	}
	cout << endl;

}

Status GetElem(LinkList L, int i, ElemType& e) {
	LinkList p;
	p = L;
	int j;
	for (j = 0; j < i && p; j++)//防止系统停止运行 
		p = p->next;
	if (!p || i < 1)return ERROR;
	e = p->data;
	return OK;
}

int LocateElem(LinkList L, ElemType e) {
	LinkList p = L->next;//初始化指向首元结点
	int i = 1;
	for ( i = 1; p && p->data != e;i++) {
		p = p->next;
		
	}
	return i;//1.p为NULL 2.p->data==e 

}

Status ListInsert(LinkList& L, int i, ElemType e) {
	//带有头结点 在第i个位置插入新结点(计数时不包含头结点)。
	LinkList p, q;
	p = L;
	int j = 0;

	q = new LNode;
	q->next = NULL;
	q->data = e;
	while (p && j < i - 1)//找第i-1个结点 
	{
		p = p->next;
		j++;
	}
	if (!p && i < 1)return ERROR;/*p为空说明未找到第i-1个结点 或者说i-1个结点是n+1 */
	q->next = p->next;//先连接后面
	p->next = q;//再断掉前面
	return OK;
}

Status ListDelete(LinkList& L, int i) {
	//找到第i-1个结点

	LinkList p, q;
	p = L;
	int j = 0;
	while (p->next && j < i - 1)//找第i-1个结点 
	{
		p = p->next;
		j++;
	}
	if (!p->next || i < 1)return ERROR;/*p->next为空则证明第i-1个结点是最后一个结点n 第i个不存在 无法删除 */
	q = p->next;//先把p-q及后面的链条全复制来,保证他们不丢失
	p->next = q->next;//用q过渡一下第i-1个和第i+1个(再直接连到q的next上到下一个元素,空架掉q
	delete q;//将过渡的这个辅助q删除掉 
	return OK;

}
void Connect(LinkList& A,LinkList& B,LinkList& C)
{
	LinkList pa, pb, t;
	pa = A->next;//pa,pb指针来遍历A,B链表,t始终指向C的尾部,采用尾插法建C链表; 
	pb = B->next;
	C = A;
	C->next = NULL;
	//free(B);
	t = C;
	// 尾插法建立链表; 
	while (pa != NULL && pb != NULL) 
	{
		if (pa->data < pb->data) 
		{	
			
				t->next = pa;
				t = t->next;
				pa = pa->next;

		}
		else if (pa->data > pb->data) 
		{
			t->next = pb;
			t = t->next;
			pb = pb->next;
		}
		else
		{
			t->next = pa;
			t = t->next;
			pa = pa->next;
			pb = pb->next;
		}
		
	}
	if (pa == NULL) {
		t->next = pb;
	}
	//B先遍历完 ,链A; 
	if (pb == NULL) {
		t->next = pa;
	}
		
		cout << "合并结果:";
		while (C->next != NULL)
		{
		C = C->next;
		cout << C->data << "  ";
		}
}
void Connect2(LinkList& A, LinkList& B, LinkList& C)
{
	LinkList pa, pb, t;
	pa = A->next;//pa,pb指针来遍历A,B链表,t始终指向C的尾部,采用尾插法建C链表; 
	pb = B->next;
	C = A;
	C->next = NULL;
	//free(B);
	t = C;
	// 尾插法建立链表; 
	while (pa != NULL && pb != NULL)
	{
		if (pa->data <= pb->data)
		{

			t->next = pa;
			t = t->next;
			pa = pa->next;

		}
		else if (pa->data > pb->data)
		{
			t->next = pb;
			t = t->next;
			pb = pb->next;
		}
	

	}
	if (pa == NULL) {
		t->next = pb;
	}
	//B先遍历完 ,链A; 
	if (pb == NULL) {
		t->next = pa;
	}

	cout << "合并结果:";
	while (C->next != NULL)
	{
		C = C->next;
		cout << C->data << "  ";
	}
}

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值