首页 > 其他分享 >数据结构上机题第二周

数据结构上机题第二周

时间:2024-09-22 20:25:01浏览次数:1  
标签:结点 return ve 上机 int ElemType next 第二周 数据结构



这题就套公式即可

6-1 结构体查找
简单的遍历,但是注意字符串的存放,要在末尾处添加'\0',否则就会过不了

int find(RECORD a[], int n,RECORD b[]){

    int p=0,sum=0;
    int swj=0;
    for(int i=0;i<n;i++)
    {
        if(a[i].score>=60 && a[i].score<=79){
            b[p].score=a[i].score;
            sum++;
            //swj swj swj 
            int j;
            for( j=0;a[i].no[j]!='\0';j++) b[p].no[j]=a[i].no[j];
            b[p].no[j]='\0';
            p++;
        }
    }
    
	return sum;
//swj
}

6-2 顺序表实现

这种出题的是真的无敌,一大堆摆在那干扰你的阅读

  • 第一个函数直接返回长度即可
  • 第二个函数注意下标是从0开始,返回的是i+1
  • 第三个函数,注意插入的位置题目要求的是1-i个位置,但是我们存放的下标是从0开始。插入的原理:在某个位置之前插入就是把这个位置和这个位置以后的所有元素往后挪一位,然后最后这个空出来的位置赋值为插入值即可。但是注意插入的位置不可以小于1或者大于L.length+1,L.length+1就是插在这个顺序表的末尾,再往后就是不符合情况的了,并且再插入完以后,注意更新顺序表的长度和存储容量
int ListLength(SqList L) 
//返回顺序线性表长度;
{
	return L.length;
}

int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
//返回L中第1个与e满足关系compare()的数据元素的位序。 若这样的数据元素不存在,则返回值为0。
{
	for(int i=0;i<L.length;i++)
	{
		int  k=L.elem[i];
		if(compare(k,e)){
			return i+1;
		}
	}
	 return 0;
	
}


Status ListInsert(SqList &L,int i,ElemType e) 
//在L中第i个位置之前插入新的数据元素e,L的长度加1,并返回OK,若i不合法,则返回ERROR,注意可能空间会已满,则L需要申请更大的存储空间;
{
	if(i<1||i>L.length+1) return ERROR;
    
	for(int j=L.length;j>=i;j--)
	{
		*(L.elem+j)=*(L.elem+j-1);
	}
	L.elem[i-1]=e; //注意我这是i-1,
    L.length++; //插入后更新长度
    
    if(L.listsize<L.length) L.listsize=L.length+1; //注意这里没写 全部0分
	return OK;
  int swj=0;
}

6-3 带头单链表实现

不懂链表的知识可以去b站看,或者看我文章数据结构
原理其实和数组是差不多的,只是我们遍历的时候,使用地址来找下一个结点,而数组是顺序存储的所以可以直接找下一个。

int ListLength(LinkList L)   
{
	LNode *p; //定义一个链表型的指针
	int ans=0;
	p=L->next; //指针指向头结点下的第一个元素
	while(p!=NULL){//求长度,当遍历到NULL时说明遍历完了
		p=p->next;
		ans++;
	}
	
	return ans;
int swj=0;
}

int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
	LNode *p;
	p=L->next;
	int j=0;
	while(p!=NULL)
	{
		if( compare(p->data,e) ) {
			return j+1;//同理下标是从0开始的
		}
		p=p->next;
		j++;
	}
	return 0;
}

Status ListInsert(LinkList &L,int i,ElemType e) 
//在L中第i个位置之前插入新的数据元素e,并返回OK,若i不合法,则返回ERROR;
{
	int len=ListLength(L);
	LNode *s;
	s=(LNode*)malloc(sizeof(LNode));//申请内存来存结点
	if(i>len+1||i<1) return ERROR;//这里是大于len+1而不是len
	int j=i-1;//遍历到第i个结点的前一个结点,让这个结点指向当前结点的下一个结点,
//当前结点再指向插入结点,也就是头插法
	LNode *p=L;
	while(j--&&p!=NULL)
	{
		p=p->next;
	}
//头插法,可以自己画图模拟一下
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
	
	
	int swj=0;
}

7-1 找最贵的书和最便宜的书

注意输入完数字以后,会有一个回车,每次输入一组数据的时候都要去吃掉回车,使用getline来输入含有空格的字符串,然后简单的结构体排序一下即可

#include <bits/stdc++.h>
using namespace std;
struct node{
	string s;
	double k;
};

int main()
{
	int n;
	cin>>n;
	vector<node>ve(n);
	for(int i=0;i<n;i++)
	{
		cin.ignore();//用来吃掉空格
		getline(cin,ve[i].s);//输入有空格的字符串
		cin>>ve[i].k;
	}
	
	sort(ve.begin(),ve.end(),[](node x,node y){
		return x.k>y.k;
	});//可以自己写个void cmp(node x, node y)
	
	cout<<fixed<<setprecision(2)<<ve[0].k<<", "<<ve[0].s;
	cout<<endl; //swj 水印
	cout<<fixed<<setprecision(2)<<ve[n-1].k<<", "<<ve[n-1].s;
	
	int swj=0;
	
}

7-2 重排链表

先对链表进行后半段的翻转,翻转完以后交替输出,或者像我一样直接排成题目要求的结构,但是我这样会比较麻烦。
用数组来模拟链表,开一个结构体,存值和地址,遍历的时候注意我写的for和while
记得讨论奇偶的情况
并且有一种情况是会有多余没用的结点,就是导数第二个测试点

#include <bits/stdc++.h>
using namespace std;
 struct node{
	int data;
	int next;
}ve[100005];


int main()
{
	int head,n;
	cin>>head>>n;
	for(int i=0;i<n;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		ve[x].data=y;
		ve[x].next=z;
	}
	n=0;
	for(int i=head;i!=-1;i=ve[i].next)
	{
		n++;
	}
	


    //先找到n/2个结点,向下取整的n/2
	int pre=-1,cnt=1,mid=-1;
	for(int i=head;i!=-1;i=ve[i].next)
	{
		if(cnt==n/2) {
			mid=i;//i是当前结点的地址
			break;
		}
		cnt++;
	}
	

    //从中间结点的下一个结点开始翻转
	int p=ve[mid].next;
	ve[mid].next=-1;
//	cout<<ve[p].data<<" "<<ve[mid].next;
	int tmp;
	for(int i=p;i!=-1;i=tmp)
	{
	    //头插法翻转
		 tmp=ve[i].next;
		ve[i].next=ve[mid].next;
		ve[mid].next=i;
			
	}
	
	int h=head;

	head=ve[mid].next;
	//翻转完以后

//	}
	
//把链表连接成题目要求的形式
	int r=head;
	mid=r;
//	cout<<mid<<endl; //swjswjswj
	int	ta,tb;
	while(r!=-1&&h!=-1)
	{
	
		ta=ve[h].next;
		tb=ve[r].next;
	
		ve[h].next=ve[r].next;	
		ve[r].next=h;
		
		r=tb;
		h=ta;
		if(ta==mid) break; //处理奇数的情况
	
		
	}
	
	
	for(int i=head;i!=-1;i=ve[i].next){
		if(i!=-1){
		if(i<10&&i!=-1) cout<<"0000";
		else if(i<100) cout<<"000";
		else if(i<1000) cout<<"00";
		else if(i<10000) cout<<"0";
		}
		cout<<i<<" "<<ve[i].data<<" ";
	
		if(ve[i].next!=-1){
		if(ve[i].next<10) cout<<"0000";
		else if(ve[i].next<100) cout<<"000";
		else if(ve[i].next<1000) cout<<"00";
		else if(ve[i].next<10000) cout<<"0";
		}
		cout<<ve[i].next<<endl;
	}
	int swj=0;
}

标签:结点,return,ve,上机,int,ElemType,next,第二周,数据结构
From: https://www.cnblogs.com/swjswjswj/p/18423475

相关文章

  • Java-数据结构-排序-(二) (๑¯∀¯๑)
    文本目录:❄️一、交换排序:    ➷ 1、冒泡排序:    ▶代码:     ➷ 2、快速排序:          ☞基本思想:          ☞方法一:Hoare法    ▶代码:           ☞方法二:挖坑法  ......
  • 数据结构与算法之间有何关系?
    相信很多人都应该上个《数据结构与算法》这门课吧,而这两个概念也如孪生兄弟一样经常被拿出来一起讨论。那它们究竟是一个什么样子的关系呢? 听到数据结构与算法我第一反应是想到了Pascal语言之父尼古拉斯·沃斯在他的《Algorithms+DataStructures=Programs》著作中提出了......
  • [数据结构与算法·C++] 笔记 1.4 算法复杂性分析
    1.4算法复杂性分析算法的渐进分析数据规模n逐步增大时,f(n)的增长趋势当n增大到一定值以后,计算公式中影响最大的就是n的幂次最高的项其他的常数项和低幂次项都可以忽略大O表示法函数f,g定义域为自然数,值域非负实数集定义:如果存在正数c和n,使得对任意的......
  • 冒泡排序、选择排序、插入排序 - JavaScript 中的数据结构和算法
    排序算法是许多计算任务的支柱,在组织数据以实现高效访问和处理方面发挥着至关重要的作用。无论您是刚刚开始探索算法世界的初学者,还是希望刷新知识的经验丰富的开发人员,了解这些基本排序技术都是至关重要的。在这篇文章中,我们将探讨一些更基本的排序算法-冒泡排序、选择排序和插......
  • 【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数
    给定一个二进制数组nums和一个整数k。k位翻转就是从nums中选择一个长度为k的子数组,同时把子数组中的每一个0都改成1,把子数组中的每一个1都改成0。返回数组中不存在0所需的最小k位翻转次数。如果不可能,则返回-1。子数组是数组的连续部分。示......
  • 数据结构:二叉树
    1.树的概念:树是一种非线性数据结构,用于表示层次关系。树由节点组成,每个节点包含一个值和指向其子节点的指针。树的特点是每个节点只能有一个父节点,但可以有多个子节点。树的基本术语:节点(Node):树的基本单位,可以存储数据。(下图中的圆圈代表一个节点)根节点(Root):树的最顶层节点,没......
  • Java后端中的数据版本控制:如何管理数据结构的演变
    Java后端中的数据版本控制:如何管理数据结构的演变大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代应用开发中,数据结构的演变是一个常见的问题,尤其是在业务需求不断变化的情况下。本文将探讨如何在Java后端中有效地实现数据版本控制,以便在应用演......
  • 数据结构指南
    单调栈单调栈的定义是:栈内元素一定是单调的。这个性质有助于排除更劣的选择,来优化时间和空间。单调栈经典例题就是往后看看到的最高元素。如果一个元素要入栈,比前面的元素都要大,那么前面的元素一定看不到栈内元素而是那个最高的元素,就可以把末尾的元素弹出了。例题考虑$dp_i$......
  • 【数据结构与算法 | 灵神题单 | 栈基础篇】力扣1441, 844, 682
    1.力扣1441:用栈操作构建数组1.1题目:给你一个数组 target 和一个整数 n。每次迭代,需要从  list={1,2,3...,n} 中依次读取一个数字。请使用下述操作来构建目标数组 target :"Push":从 list 中读取一个新元素,并将其推入数组中。"Pop":删除数组中的最后一......
  • 61.《数据结构-栈 队列 串》
    栈栈是受限的线性表(只允许在一端进行插入删除操作)LIFO特点后进先出当n个不同元素进栈时,出栈元素的不同排列个数1/(n+1)Cn2n顺序栈:(S.top=-1)进栈:if(S.top==MaxSize-1)栈满S.data[++S.top]=x入栈:if(S.top==-1)栈空x=S.data[S.top--]大致理解图:链栈:不......