数据结构学习

数据结构学习

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

/简单顺序表的实现
#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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux ldd命令源代码,Linux中ldd命令的用法详解[通俗易懂]

    linux ldd命令源代码,Linux中ldd命令的用法详解[通俗易懂]Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧。ldd命令用于判断某个可执行的binary档案含有什么动态函式库LinuxLdd参数说明:–version  打印ldd的版本号-v–verbose  打印所有信息,例如包括符号的版本信息-d–data-relo…

    2022年5月6日
  • 学习使用Java Quartz任务调度(一)

    学习使用Java Quartz任务调度(一)//本着以交流经验和学习的态度来分享知识,如果有误,请批评指出,不胜感激!现在企业中基本均有涉及到任务调度和异步执行器,在Java方向,提供了开源的Quartz、JDK提供了Timer。在以上基础前提下,Java5.0通过java.util.concurrent这个新包以及它下边的诸多类和接口,提供了方便的线程池调用。在本篇文章中,我们主要使用Quartz来作为解决任务调度的工具。为什么不…

    2022年7月13日
  • 距离和相似度度量方法

    距离和相似度度量方法http://blog.csdn.net/pipisorry/article/details/45651315在机器学习和数据挖掘中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)等等。不同距离度量的应用场景根据数据特性的不同,可以采用不同的度量方法。whi…

    2022年6月19日
  • cmd命令怎么切换盘符_cmd命令行怎么切换到d盘

    cmd命令怎么切换盘符_cmd命令行怎么切换到d盘用命令行,要从C盘切换到F盘,然后傻傻地输入了cdcd是在同一个盘下切换空间用的盘之间切换应该用:F:盘符名加一个冒号,大小写不限。

    2022年10月3日
  • 高并发情况下你还在用Random生成随机数?

    高并发情况下你还在用Random生成随机数?不是吧,阿sir

    2022年5月31日
  • CMD查看端口占用并关闭命令

    CMD查看端口占用并关闭命令1.查询端口netstat-ano|findstr“123456”TCP127.0.0.1:12340.0.0.0:0LISTENING67892.查询端口名tasklist|findstr“6789”studio64.exe6789Console31,385,024K3.关闭端口taskkill/pid“6789”/F.

    2022年5月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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