首页 > 编程语言 >《数据结构与算法分析》作业一(详解版)

《数据结构与算法分析》作业一(详解版)

时间:2024-03-23 19:33:02浏览次数:25  
标签:return temp int next 算法 详解 link printf 数据结构

1. 什么是数据结构?有关数据结构的讨论涉及哪三个方面?

答:

(1)数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.

(2)逻辑结构、存储结构以及运算结构。

2. 什么是算法?算法的特性有哪些?根据这些特性,解释算法与程序的区别?

答:

(1)算法是一组明确指定的简单指令集,即有限的指令序列,用来解决一个问题。

(2)输入:由外部提供的量作为算法的输入。

        输出:算法产生至少一个量作为输出。

        确定性:组成算法的每条指令是清晰,无歧义的。

        有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。

        可行性:算法中所有的操作都必须足够基本,使算法的执行者或阅读者明确其含义以及如何执行。

(3)a.算法必须满足有穷性,而程序不一定满足有穷性,比如Windows操作系统在用户没有退出、硬件不出现故障以及有电的条件下理论上可以无限时运行。

        b. 算法是解决问题的步骤;程序是算法的代码实现。

        c. 算法对于特定的输入有特定的输出,程序提供了确定算法结果的平台。

        d. 算法需要考虑设计的可能,程序则具体是实现算法上的设计。

3. 请分析以下程序的时间复杂度。

(1)程序1:

void Matmpy( int n )
{
	int i, j, k;
	for (i = 0; i <= n-1; i ++ )
		for (j = 0; j <= n-1; j ++ ){
			C[i][j] = 0;
			for (k = 0; k <= n-1; k ++ )
			C[i][j] = C[i][j] + A[i][k] * B[k][j];
		}
}

时间复杂度为O(n^3)

(2)程序2:

void Mystery( int n )
{
	int i, j, k;
	for (i = 1; i < n; i ++ )
		for (j = i + 1; j <= n; j ++ )
			for (k = 1; k <= j; k ++ ){
			/ * some statement requiring O(1) time * /
			}
}

时间复杂度为O(n^3)

(3)程序3:

void Podd( int n )
{
	int i, j, x, y;
	for (i = 1; i <= n; j ++ )
		if (odd(i)){
			for (j = i; j <= n; j ++ )
				x = x + 1;
			for (j = 1; j <= i; j ++ )
				y = y + 1;
		}
}

 时间复杂度为O(n^2)

4. 请设计与实现一个求最大公因数的算法。附可实现的代码。

#include<stdio.h>
int main()
{
	int m,n,r;
	scanf("%d",&m);
	scanf("%d",&n);
	if(n>m)
	{
		r=n;
		n=m;
		m=r;
	}
	r=m%n;
	while(r!=0)
	{
		m=n;
		n=r;
		r=m%n;
	}
	printf("最大公因数位:%d",n);
	return 0;
}

5、线性表可用顺序存储结构或链式存储结构。那么,(1)两种存储表示各有哪些主要优缺点?(2)如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变,在此情况下,应选用哪种存储表示?为什么?(3)若表的总数基本稳定,并且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?

答:

(1)

顺序存储结构优点:

a.逻辑结构与存储结构一一对应,无须为表示表中元素之间的逻辑关系而增加额外的存储空间。

b.可以快速地存取表中任一位置的元素。

顺序存储结构缺点:

a.插入或删除元素时不方便,需要移动大量元素。

b.长度需要预先去规定,当线性表长度变化较大时,难以确定存储空间的容量。

c.造成存储空间的碎片。

链式存储结构优点:

a.插入或删除元素时很方便,使用灵活。

b.长度就是精确的长度,需要多少结点就开辟多少空间。

链式存储结构缺点:

a.需要占用额外的空间去存放指针,存储空间利用率不高。

b.不可以随机访问。

(2)选择链式存储结构,因为链表结构使用更加灵活,需要多少长度就新建多少结点。

(3)选择顺序存储结构,因为顺序存储结构的元素逻辑结构和存储结构一一对应,可以随机存取;而链表中元素的逻辑关系是通过指针表示,一个接一个的指向下一个,所以需要从第一个开始,并不是随机存取,效率较低。所以选择顺序存储结构。

6、分别对顺序表和单链表,完成以下操作(函数):

1)插入操作(函数)insert

2)删除操作(函数)delete

3)返回某元素位置操作(函数)locate

4)统计给定值x的所有元素操作(函数)number

答:

顺序表:

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 100
typedef struct{
	int data[Maxsize];
	int length;
}List;

void initList(List &L)
{
	L.length=0;
}

void insertList(List &L,int i,int e)
{
	if(L.length>=Maxsize-1)
	printf("FULL");
	else if(i<1||i>=L.length)
	printf("Location does not exist!");
	if(i>=1&&i<=L.length-1)
	{
		for(int j=L.length;j>=i;j--)
		{
			L.data[j]=L.data[j-1];
		}
		L.data[i-1]=e;
		L.length++;
	}
}

void deletList(List &L,int i)
{
	if(L.length>=Maxsize-1)
	printf("FULL");
	else if(i<1||i>=L.length)
	printf("Location does not exist!");
	if(i>=1&&i<=L.length-1)
	{
		for(int j=i-1;j<L.length;j++)
		{
			L.data[j]=L.data[j+1];
		}
		L.length--;
	}
}

int locateList(List &L,int x)
{
	int num;
	for(int i=0;i<L.length;i++)
	{
		if(L.data[i]==x)
		{
		num=i+1;
		return num;	
		}
	}
	return -1;
}

int numberList(List &L,int x)
{
	int num=0;
	for(int i=0;i<L.length;i++)
	{
		if(L.data[i]==x)
		num++;
	}
	return num;
}

void displayList(List L)
{
	int i;
	for(i=0;i<L.length;i++)
	{
		printf("%d ",L.data[i]);
	}
	printf("\n");
} 


int main()
{
	int s,num;
	List L;
	initList(L);
	for(int i=0;i<=5;i++)
	{
		L.data[i]=i+1;
		L.length++;
	}
	printf("The original sequence table is:"); 
	displayList(L);
	printf("The inserted list is:");
	insertList(L,3,5);
	displayList(L);
	
	printf("The list after deleting the element at position 4 is:");
	deletList(L,4);
	displayList(L);
	
	s=locateList(L,1);
	printf("The position of element 1 is:%d\n",s); 
	
	num=numberList(L,5);
	printf("The number of elements with a value of 5 is:%d\n",num);
	return 0;
}

单链表:

#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
	int elem;
	struct Link *next;
}link;

link * initLink()
{
    link * p=(link*)malloc(sizeof(link));
    link * temp=p;
    for (int i=1; i<7; i++) 
	{
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

link * insertElem(link * p,int elem,int add)
{
    link * temp=p;
    for (int i=1; i<add; i++) 
	{
        if (temp==NULL) {
            printf("error\n");
            return p;
        }
        temp=temp->next;
    }
    link * c=(link*)malloc(sizeof(link));
    c->elem=elem;
    c->next=temp->next;
    temp->next=c;
    return  p;
}

link * deletElem(link * p,int add)
{
    link * temp=p;
    for (int i=1; i<add; i++) 
	{
        if (temp==NULL) {
            printf("error\n");
            return p;
        }
        temp=temp->next;
    }
    temp->next=temp->next->next;
    return p;
}

int selectElem(Link* p, int elem) 
{
    int i = 1;
    link* temp=p;
    temp = temp->next;
    while (temp) 
	{
        if (temp->elem == elem) 
		{
            return i;
        }
        temp = temp->next;
        i++;
    }
    return -1;
}

int numberElem(Link* p, int elem) 
{
    int i = 0;
    link* temp=p;
    temp = temp->next;
    while (temp) 
	{
        if (temp->elem == elem) 
		{
            i++;
        }
        temp = temp->next;
    }
    return i;
}

void display(link *p)
{
    link* temp=p;
    while (temp->next) 
	{
        temp=temp->next;
        printf("%d ",temp->elem);
    }
    printf("\n");
}

int main() {
    printf("The initialization linked list is:\n");
    link *p=initLink();
    display(p);
    
    printf("The linked list after the element is inserted at the third position is:\n");
    p=insertElem(p, 5, 3);
    display(p);
    
    printf("The element list after deleting the fourth position is:\n");
    p=deletElem(p, 4);
    display(p);
    
    printf("element 4 location of:%d\n",selectElem(p, 4));
    
    printf("The number of element values of 2 is:%d\n",numberElem(p, 5));

    return 0;
}

7、 写一个交换单向链表中位置PNext(P)的元素的算法。

#include<stdio.h>
#include<stdlib.h>
typedef struct Link{
	int elem;
	struct Link *next;
}link;

link * initLink()
{
    link * p=(link*)malloc(sizeof(link));
    link * temp=p;
    for (int i=1; i<10; i++) 
	{
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

Link *swapLink(link * p,int x)
{
	link *pTemp=(link*)malloc(sizeof(link));
	link * temp=p;
	for (int i=1; i<x; i=i+1) 
	{
        if (temp==NULL) {
            printf("error\n");
            return p;
        }
        temp=temp->next;
    }
    if(temp==NULL)
    {
    	printf("Error: the exchanged location does not exist. The original linked list is\n");
	}
	else
	{
	pTemp = temp->next; 
    temp->next = pTemp->next; 
    pTemp->next = pTemp->next->next; 
    temp->next->next = pTemp; 	
	}
    return p;
}

void display(link *p)
{
    link* temp=p;
    while (temp->next) 
	{
        temp=temp->next;
        printf("%d ",temp->elem);
    }
    printf("\n");
}

int main() {
    printf("The initialization linked list is:\n");
    link *p=initLink();
    display(p);
    
    printf("The linked list after position exchange is:\n");
	swapLink(p,3);
    display(p);
    
    return 0;
}

8、 铁路进行列车调度时,常把站台设计成栈式结构的站台,如图所示。试问:

(1)设有编号为1,2,3,4,5,6的6辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?

(2)若进站的6辆列车顺序如上述所示,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出“进栈”或“出栈”的序列)。

答:

(1)可能的出栈序列有132种。

(2)不能得到435612,154623。对于435612,在4356出栈之后,栈内仅剩12两个元素,其中1先入栈,在栈底,2后入栈,在栈顶,由于后进先出原则应该是2先出栈即435621。对于154623,1546元素出栈后,仅剩23两个元素,2先入栈,在栈底,3后入栈,在栈顶,由于后进先出原则应该是3先出栈即154632。手绘说明图如下

9、写出以下中缀表达式的后缀表达式:

(1)  A×B×C

(2)  –A+B-C+D

(3)  (A+B) ×D+E/(F+A×D)+C

(4)  A×B–C/B^2

答:

(1)AB*C*

(2)A-B+C-D+

(3)AB+D*EFAD*+/+C+

(4)AB*CB2^/-

10、(1)实现数据存放循环队列。以front和rear为队列的队首队尾。(2)实现入队和出队元素的操作。(3)基于循坏队列实现约瑟夫环问题。(请附上可执行的代码)

(1)(2)代码

#include<stdio.h>
#define Maxsize 5

typedef struct{
	int data[Maxsize];
	int front;
	int rear;
}Queue;

void initQueue(Queue &Q)
{
	Q.front=0;
	Q.rear =0;
}

void EnQueue(Queue &Q,int x)
{
	if((Q.rear+1)%Maxsize==Q.front)
	printf("The queue is full");
	else
	{
		Q.data[Q.rear]=x;
		Q.rear=(Q.rear+1)%Maxsize;
	}
}

void DeQueue(Queue &Q)
{
	if(Q.rear==Q.front)
	printf("The queue is empty");
	else
	Q.front=(Q.front+1)%Maxsize;
}

void displayQueue(Queue Q)
{
	int i = Q.front;
	while(i != Q.rear) 
	{
		printf("%d ",Q.data[i]);
		i = (i+1)%Maxsize;
	}
	printf("\n");
}

int main()
{
	int i,d;
	Queue Q;
	initQueue(Q);
    for(i=0;i<Maxsize-1;i++)
    {
    	printf("Please enter the value of the element you want to join:\n");
		scanf("%d",&d); 
		EnQueue(Q,d);
	}

	printf("The queue after the element is queued is:\n");
    displayQueue(Q);
    
    printf("The queue after the exit is:\n");
    DeQueue(Q);
    displayQueue(Q);
    
	return 0;
}

(3) 实现约瑟夫环代码

#include<stdio.h>
#define Maxsize 50
typedef struct
{
	int data[Maxsize];
	int front;
	int rear; 
}Queue;

void InitQueue(Queue* &Q)
{
	Q=new Queue;
	Q->front=-1;
	Q->rear=-1;
} 

int QueueEmpty(Queue *Q)
{
	if(Q->front==Q->rear)
		return 1;
	else
		return 0;
 }
  
int enQueue(Queue* &Q,int e)
{
	Q->rear=(Q->rear+1)%Maxsize;
	if(Q->rear==Q->front)
		return 0;
	Q->data[Q->rear]=e;
  	return 1;
 } 
 
int deQueue(Queue* &Q,int &e)
{
	if(Q->front==Q->rear)	
		return 0;
	else
	{
		Q->front=(Q->front+1)%Maxsize;
    	e=Q->data[Q->front];
    	return 1;
	}  
}

void yuesefuhuan(Queue* &Q,int a[],int m)
{
	int i=0,j=0;
	int e;
	while(!QueueEmpty(Q))
	{
		i++;
		deQueue(Q,e);
		if(i==m)
		{
			a[j]=e;
			i=0,j++;
		}
		else
		{
			enQueue(Q,e);
		}
	}
} 

void displayQueue(int a[],int n)
{
	int i;
	for(i=0;i<n;++i)
	{
		printf("%d ",a[i]);
	}
} 

int main()
{
	int n,m;
	Queue *Q;
	InitQueue(Q);
	
	printf("Please enter how many people:\n");
	scanf("%d",&n);
	
    printf("Please enter the value of m:\n") ;
    scanf("%d",&m);
    
    int a[n];
	for(int k=0;k<n;++k)
	{
		a[k]=k+1;
		enQueue(Q,a[k]);
	}
	
	printf("Then the order of their leaving the team is:\n");
	yuesefuhuan(Q,a,m);	
	displayQueue(a,n);
}

标签:return,temp,int,next,算法,详解,link,printf,数据结构
From: https://blog.csdn.net/Luan__Yu/article/details/136835094

相关文章

  • 物理查询优化(二):两表连接算法(附具体案例及代码分析)
    前言关系代数的一项重要操作是连接运算,多个表连接是建立在两表之间连接的基础上的。研究两表连接的方式,对连接效率的提高有着直接的影响。连接方式是一个什么样的概念,或者说我们为何要有而且有好几种,对于不太了解数据库的人来讲可能这些是开头的疑惑。简单来讲,我们将数据存......
  • 03天【代码随想录算法训练营34期】第二章 链表part01(203.移除链表元素 、707.设计链表
    203.移除链表元素竟然可以做个假head,学到了classListNode(object):def__init__(self,val=0,next=None):self.val=valself.next=nextclassSolution(object):defremoveElements(self,head,val):dummy_head=ListNode(-1)......
  • BUGAWAY算法小抄-树状数组(2024.03.23 更新)
    什么是树状数组?树状数组是支持单点修改和区间查询的、代码量小的数据结构。事实上,树状数组能解决的问题是线段树(一棵二叉树,每个节点表示一个区间,并存储该区间的一些相关信息。线段树可以高效地进行区间查询和区间更新操作。不是本文重点)能解决的问题的子集:树状数组能做的,线段树......
  • Python机器学习笔记:CART算法实战
    完整代码及其数据,请移步小编的GitHub传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/MachineLearningNote前言在python机器学习笔记:深入学习决策树算法原理一文中我们提到了决策树里的ID3算法,C4.5算法,并且大概的了解了CART算法。对于ID3算法的实战可......
  • 代码随想录算法训练营第五十五天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离
    两个字符串的删除操作 题目链接:583.两个字符串的删除操作-力扣(LeetCode)思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。classSolution{public:intminDistance(stringword1,stringword2......
  • 模拟堆(详解+例题)
    一、定义维护一个数据集合,堆是一个完全二叉树。那么什么是二叉树呢?如图:二、关于小根堆实现性质:每个根节点都小于等于左右两边,所以树根为最小值。 2.1、堆存储(用一维数组来存) 记住规则:x(根)的左儿子=x*2;          x(根)的右儿子=x......
  • 代码随想录算法训练营第3天 | 链表 |虚拟头哨兵
    链表理论基础链表节点的定义structListNode{intval;//节点上存储的元素ListNode*next;//指向下一个节点的指针ListNode(intx):val(x),next(NULL){}//节点的构造函数};==如果不自己定义构造函数,就无法通过ListNodep(5);来初始化203删除......
  • 代码随想录算法训练营day31 | leetcode 455. 分发饼干、376. 摆动序列、53. 最大子数
    目录贪心理论基础核心:题目链接:455.分发饼干-简单题目链接:376.摆动序列-中等题目链接:53.最大子数组和-中等贪心理论基础核心:由局部推全局最优题目链接:455.分发饼干-简单题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每......
  • 分布式详解
    文章目录概述分布式开发优点和缺点分布式存在的作用分布式和集群的区别集群的特点BASE理论BASE理论的三要素CAP理论二段式满足cap理论的哪两个理论分析下分布式强一致性、弱一致性、最终一致性衡量分布式系统的指标分布式下down机的处理⽅案分布式系统设计paxos和raft......
  • python 内置数据结构-数值型
    内置数值型数据结构int整数(int):在Python中,整数是没有小数部分的数字。整数可以是正数、负数或零。Python中的整数没有大小限制,取决于内存区域的大小,可以表示任意大小的整数。x=10y=-5z=0print(x,y,z)#输出:10-50float浮点数(float):浮点数是带有小数......