数据结构学习

数据结构学习

最近发现学长这数据结构总结的真是不错,今天重头看了一遍,我基础差,我感觉还是先把基本的操作学熟后,再连连高端操作,我感觉把这些程序自己再打一遍的话,数据结构前几单元就没问题了。
/
一,

/简单顺序表的实现
#include<iostream> 
#define MAXSIZE 10
#define OVERFLOW -2
using namespace std;
 
typedef struct{
	int *elem;//数据域 
	int length;//长度 
}Sqlist;//顺序表 
 
bool InitList(Sqlist &L)
{
	L.elem=new int[MAXSIZE];
	if(!L.elem)	
		return false;
	L.length=0;
	return true;
}//判断是否为空表 
 
int ListInsert(Sqlist &L,int i,int e)
{
	if(i<1||i>L.length+1)
		return false;
	if(L.length==MAXSIZE)
		return OVERFLOW;
	for(int j=L.length-1;j>=i-1;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i-1]=e;
	L.length++;
	return true;	
} //删除元素的位置 
 
bool GetElem(Sqlist L,int i,int &e)
{
	if(i<1||i>L.length)
	{
		cout << "访问位置不合法!\n";
		return false;
	}
	e=L.elem[i-1];
	return true; 
}
//删除第i个元素 
bool ListDelete(Sqlist &L,int i)
{
	if(i<1||i>L.length)
		return false;
	for(int j=i;j<L.length;j++)
		L.elem[j-1]=L.elem[j];
	L.length--;
	return true;
}
//定位e 
int LocateElem(Sqlist L,int e)
{
	for(int i=0;i<L.length;i++)
		if(L.elem[i]==e)
			return i+1;
	return 0; 
}
 
void ClearList(Sqlist &L)
{
	L.length=0;
}
 
int main()
{
	int n;
	Sqlist L;
	cout << "简单顺序表的基本操作:\n"
		 << "1、建立顺序表并存储5个数\n"
		 << "2、插入\n"
		 << "3、删除\n"
		 << "4、查找\n"
		 << "5、取值\n"
		 << "6、清空\n"
		 << "0、退出系统\n";
	while(1)
	{
		int k,l,m;
		cout <<"输入序号,进行相关操作:";
		cin >> n;
		switch(n)
		{
			case 1:
				if(InitList(L))
				{
					cout << "顺序表创建成功\n";
					for(int i=1;i<=5;i++)
						ListInsert(L,i,i); 
				}
				else 
				{
					cout << "顺序表创建失败,自动退出程序!\n";
					break;
				}
				break;
			case 2:
				cout << "请输入插入位置与插入值:";	
				cin >> k >> l;
				m=ListInsert(L,k,l);
				if(!m)
				{
					cout << "插入失败!\n";
					if(m==OVERFLOW)
						cout << "初始分配空间已满!\n";
					else 
						cout << "插入位置不合法!\n";
				}	
				break;
			case 3:
				cout << "请输入要删除元素的位置:";
				cin >> l;
				m=ListDelete(L,l);
				if(!m)
					cout << "删除位置不合法!\n";
				break;
			case 4:
				cout << "请输入要查找的值:";
				cin >> k;
				m=LocateElem(L,k); 
				if(!m)
					cout <<"顺序表中没有这个值!\n";
				else
					cout << m << endl;
				break;
			case 5:
				cout << "请输入要取第几个值:";
				cin >> k;
				GetElem(L,k,m);
				if(m!=false)
					cout << m << endl;
				break;
			case 6:
				ClearList(L);
				break;
			case 0:
				exit(0);
		}
		cout << "------------------------------------------------\n";
		cout << "当前顺序表:\n";
		for(int i=1;i<=L.length;i++)
		{
			int m;
			GetElem(L,i,m);
			cout << m << " ";
		}
		cout << "\n------------------------------------------------\n";
	}
	return 0;
}

二,

//简单实现单链表
#include<iostream>
 
using namespace std;
 
typedef struct LNode{
	int data;				//数据域 
	struct LNode *next;		//指针域 
}LNode,*Linklist;
 
bool InitList(Linklist &L)
{
	L=new LNode;

    	L->next=NULL;
    	L->data=0;
	return true;
}
 
bool GetElem(Linklist &L,int i,int &e)
{
	LNode *p=L->next;
	int j=1;
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i)
		return false;
	e=p->data;
	return true;
}
 
//头插创建链表 
void CreateList_H(Linklist &L,int n)
{
	L=new LNode;
	L->next=NULL;
	L->data=0;
	for(int i=0;i<n;i++)
	{
		int m;
		LNode *p=new LNode;
		cin >> m;
		p->data=m;
		p->next=L->next;
		L->next=p; 
		L->data++;
	}
}
 
//尾插 
void CreateList_R(Linklist &L,int n)
{
	L=new LNode;
	L->data=0;
	L->next=NULL;
	LNode *r;
	r=L;
	for(int i=0;i<n;i++)
	{
		int m;
		LNode *p=new LNode;
		cin >> m;
		p->data=m;
		p->next=NULL;
		r->next=p;
		r=p;
		L->data++;
	}
}
 
//插入
bool ListInsert(Linklist &L,int i,int e)
{
	LNode *p=L;
	int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p||j>i-1)
		return false;
	LNode *s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	L->data++;
	return true;
} 
 
bool ListDelete(Linklist &L,int i)
{
	LNode *p=L;
	int j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		j++; 
	} 
	if(!(p->next)||j>i-1)
		return false;
	LNode *q;			//存储p->next  为了一会儿释放 
	q=p->next;
	p->next=q->next;
	L->data--;
	delete q;
	return true;
}
 
//定位
int LocateElem(Linklist L,int e)
{
	LNode *p=L->next;
	int j=1;
	while(p&&p->data!=e)
	{
		p=p->next;
		j++;
	}
	if(j>L->data)
		return false;
	return j;
 } 
 
void ClearList(Linklist &L)
{
	LNode *p,*q;
	p=L->next;
	while(p)
	{
		q=p->next;
		delete p;
		p=q;
	}
	L->next=NULL;
}
 
int main()
{
	cout << "-----简单实现单链表:----\n"
		 << "1、链表初始化\n"
		 << "2、插入\n" 
		 << "3、头插创建n个数的链表\n"
		 << "4、尾插创建n个数的链表\n"
		 << "5、删除\n"
		 << "6、取值\n"
		 << "7、定位\n"
		 << "8、销毁\n"
		 << "0、退出系统\n";
	int n;
	Linklist L;			
	while(1)
	{
		int num;
		int j,k;
		cout << "-------------------------------------\n";
		cout << "请输入想要执行的操作:";
		cin >> n;
		switch(n)
		{
			case 1:
				if(InitList(L))
					cout << "链表初始化成功!\n";
				break;
			case 2:
				cout << "请输入要插入的位置,以及要插入的数据元素:";
				cin >> j >> k;
				if(ListInsert(L,j,k))
					cout << "插入成功!\n";
				else 
					cout << "插入位置不合法!\n";
				break;
			case 3:
				cout << "请输入你想要存储多少个数:";
				cin >> num;
				CreateList_H(L,num);
				break; 
			case 4:
				cout << "请输入你想要存储多少个数:";
				cin >> num;
				CreateList_R(L,num);
				break;
			case 5:
				cout << "请输入要删除第几个元素:";
				cin >> j;
				if(ListDelete(L,j))
					cout << "删除成功!\n";
				else	
					cout << "删除位置不合法!\n";
				break;
			case 6:
				cout << "请输入要取第几个位置的元素:";
				cin >> j;
				if(GetElem(L,j,k))
					cout << "第" << j << "个位置的元素是" << k << endl;
				else
					cout << "位置不合法!\n";
				break; 
			case 7:
				cout << "请输入要找的值:";
				cin >> k;
				num=LocateElem(L,k);
				if(num)
					cout << "在第" <<  num << "个!\n";
				else 
					cout << "没有找到该值!\n";
				break;
			case 8:
				cout << "链表已经销毁!自动退出程序!\n";
				exit(0);
			default :
				exit(0);
				
		}
		cout << "--------------------------------------------\n";
		cout << "当前链表的长度是" << L->data << "!\n";
		cout << "当前链表的数字信息是:\n";
		for(int i=1;i<=L->data;i++)
		{
			int e;
			GetElem(L,i,e);
			cout << e << "  ";
		}
		cout << "\n";
	}	
	return 0;
}

三,

多项式合并
//实现多项式的运算 
#include<iostream>
 
using namespace std;
 
typedef struct PNode{
	float coef;			//系数 
	int expn;			//指数 
	struct PNode *next;
}PNode,*Polyn;


//创建多项式  实现链表递增 
void CreatePolyn(Polyn &L,int n)
{
	L=new PNode;		//创建带有头结点的空链表
	L->next=NULL;
	for(int i=0;i<n;i++)
	{
		Polyn s=new PNode;
		cout << "请输入第" << i+1 << "个系数和指数(中间用空格隔开):";
		cin >> s->coef >> s->expn;		
		PNode *pre,*q;
		pre=L;			//pre指向待找结点前驱 
		q=L->next;		//q指向待找结点 
		while(q&&q->expn < s->expn)
		{
			pre=q;
			q=q->next;
		}
		//然后把s插入到pre和q中间
		s->next=q;
		pre->next=s;
	}
}
 
//遍历取值 
void T_GetElem(Polyn L)
{
	PNode *p;
	p=L->next;
	while(p)
	{
		cout << p->coef << " " << p->expn << endl;
		p=p->next;
	}
}
 
//多项式相加
void AddPolyn(Polyn &A,Polyn &B)
{
	PNode *p1,*p2,*p3;
	p1=A->next;p2=B->next;
	p3=A;	
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sum=p1->coef+p2->coef;
			//如果和等于0  销毁p1 p2 
			//否则 销毁p2,改变p1的指数值 
			if(sum==0)
			{
				PNode *r=p1;p1=p1->next;delete r;
				PNode *w=p2;p2=p2->next;delete w;
			}
			else
			{
				p1->coef=sum;
				PNode *r=p2;p2=p2->next;delete r;
				//把p1链在p3之后,再更新p3 
				p3->next=p1;
				p3=p1;
				p1=p1->next;
			}
		}
		else if(p1->expn<p2->expn)
		{
			//链p1  p1指向下一个结点 
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		} 
		else
		{
			//链p2 
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	p3->next=p1?p1:p2;
	delete B;		//销毁B的表头 
} 
 
//A-B
void SubPolyn(Polyn &A,Polyn &B)
{
	PNode *p1,*p2,*p3;
	p1=A->next;p2=B->next;
	p3=A;
	while(p1&&p2)
	{
		if(p1->expn==p2->expn)
		{
			int sub=p1->coef-p2->coef;
			if(sub==0)
			{
				PNode *r=p1;p1=p1->next;delete r;
				PNode *w=p2;p2=p2->next;delete w;
			}
			else 
			{
				p1->coef=sub;
				p3->next=p1;
				p3=p1;
				p1=p1->next;
				PNode *r=p2;
				p2=p2->next;
				delete r;
			}
		}
		else if(p1->expn < p2->expn)
		{
			p3->next=p1;
			p3=p1;
			p1=p1->next;
		}
		else 
		{
			p2->coef=-p2->coef;
			p3->next=p2;
			p3=p2;
			p2=p2->next;
		}
	}
	if(!p1)
	{
		p3->next=p2;
		p3=p2;
		while(p3)
		{
			p3->coef=-p3->coef;
			p3=p3->next;
		}
	}
	else if(!p2)
	{
		p3->next=p1;
	}
	delete B;
}
 
int main()
{
	Polyn PA,PB;
	int n;
	cout << "输入多项式 PA 的项数 :" ;
	cin >> n;
	CreatePolyn(PA,n);
	cout << "多项式PA的各个系数:\n";
	T_GetElem(PA);
	cout << "------------------------\n";
	cout << "输入多项式 PB 的项数 :" ;
	cin >> n;
	CreatePolyn(PB,n);
	cout << "多项式PB的各个系数:\n";
	T_GetElem(PB);
	cout << "------------------------\n";
	cout << "现在你可以做一个选择:\n";
	cout << "1、PA+PB\n2、PA-PB\n3、PB-PA\n0、退出程序\n";
	cin >> n;
	switch(n)
	{
		case 1:
			AddPolyn(PA,PB);
			cout << "相加后的各项:\n";
			T_GetElem(PA);
			break;
		case 2:
			cout << "PA-PB后的各项:\n";
			SubPolyn(PA,PB);
			T_GetElem(PA);
			break;
		case 3:
			cout << "PB-PA后的各项:\n";
			SubPolyn(PB,PA);
			T_GetElem(PB);
			break;
		case 0:
			exit(0);
	} 
	return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114915.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Pycharm中安装Pygame方法「建议收藏」

    Pycharm中安装Pygame方法「建议收藏」本文转自:https://blog.csdn.net/zhangffyy/article/details/78524592第一步:打开Pycharm第二步:点File-&amp;amp;amp;gt;DefaultSettings-&amp;amp;amp;gt;ProjectInterpreter-&amp;amp;amp;gt;点加号第三步:搜索Pygame-&amp;amp;amp;gt;InstallPackage然后就安装好了,新建一个p

  • ubuntu: 查看cuda版本

    ubuntu: 查看cuda版本nvcc-V

  • Idea编译:Java找不到符号「建议收藏」

    Idea编译:Java找不到符号「建议收藏」在使用idea编译运行程序时,有时会出现‘Java找不到符号’的报错,一般可采取以下几种方法:1、选择相应的模块,使用maven的reloadproject2、重启idea3、设置统一的编码,一般为UTF-84、重新build5、经过以上操作依旧没有效,直接追溯报错的位置,发现是log,注释这行代码后重新编译,报错显示下面的log,因此基本判断出是日志这块儿的问题。日志我使用的是@Slf4j注解:lombok依赖使用的1.18.2版本<dependency>

  • 目标检测(Object Detection)

    目标检测(Object Detection)文章目录目标检测(ObjectDetection)一、基本概念1.什么是目标检测2.目标检测的核心问题3.目标检测算法分类1)TowStage2)OneStage4.目标检测应用1)人脸检测2)行人检测3)车辆检测4)遥感检测二、目标检测原理1.候选区域产生1)滑动窗口2)选择性搜索①什么是选择性搜索②选择搜索流程③选择搜索优点2.数据表示3.效果评估4.非极大值抑制三、目标检测模型1.R-CNN系列1)R-CNN①定义②流程③效果④缺点2)FastR-CNN①定义

  • pip怎么卸载安装包_pip卸载所有库

    pip怎么卸载安装包_pip卸载所有库$pip2installxxx$pip2unstallxxx

  • Python实现AI图像识别-身份证识别

    Python实现AI图像识别-身份证识别图像识别说白了就是把一张照片上面的文字进行提取,提供工作效率需求分析身份证识别主要是把一张身份证照片上面的文字信息进行提取,不用再使用人工去手动抄写了,下面给大家说的这个身份识别主要是使用python+flask+华为云OCR进行实现的。步骤申请华为云OCR接口获取token调用身份证识别接口提取身份证信息申请华为云OCR接口图像识别主要使用的就是华为云OCR平台申请的接口,申请地址为:“https://www.huaweicloud.com”。访问申请的地址后点击菜单栏中的“控制台”

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号