广工 Anyview 数据结构习题 第一章

广工 Anyview 数据结构习题 第一章

作者水平有限,如果读者有更好的实现,可留言。有任何问题,欢迎留言交流。

【题目】试写一算法,如果三个整数a,b和c的值

不是依次非递增的,则通过交换,令其为非递增。

void Descend(int &a, int &b, int &c)
/* 通过交换,令 a >= b >= c */
{
    if (a<=b)
	{
		int t=a;
		a=b;
		b=t;
		if (b<=c)
		{
			int t1=b;
			b=c;
			c=t1;
			if (a<=b)
			{
				int t2=a;
				a=b;
				b=t2;
			}
		}
	}	
}

【题目】试编写算法求一元多项式

P(x) = a0 + a1x + a2x^2 + ... + anx^n

的值P(x0),并确定算法中每一语句的执行次数和整个算法
的时间复杂度。

float Polynomial(int n, int a[], float x)
/* 求一元多项式的值P(x)。                  */
/* 数组a的元素a[i]为i次项的系数,i=0,...,n */
{
    float p = a[n];

    for (i = 1; i<=n; i++)
    {
        p = a[n-i] + 
    }
    
        sum = sum + a[0];
        sum = sum + a[1] * x;
    return sum;
}

【题目】已知k阶裴波那契序列的定义为

f(0)=0, f(1)=0, ..., f(k-2)=0, f(k-1)=1;
f(n)=f(n-1)+f(n-2)+...+f(n-k), n=k,k+1,...

试编写求k阶裴波那契序列的第m项值的函数算法,
k和m均以值调用的形式在函数参数表中出现。

Status Fibonacci(int k, int m, int &f) 
/* 求k阶斐波那契序列的第m项的值f */
{
    	int i,j;
	if (k < 2 || m < 0)
		return	ERROR;

	if (m < k - 1)
	{
		f = 0;
		return OK;
	}
	if (m == k || m == k - 1)
	{
		f = 1;
		return OK;
	}
	else
	{
		int* l;
		l = (int*)malloc(k * sizeof(int));

		for (i = 0; i < k - 1; i++)
			l[i] = 0;

		l[k - 1] = 1;

		for (i = k; i < m; i++)
		{
			for (j = k - 1; j > 0; j--)
			{

				int tmp = l[j];
				l[j] = l[j - 1];
				l[j - 1] = tmp;
			}


			int v = 0;
			for (j = 0; j < k; j++)
				v += l[j];

			l[k - 1] = v;

			f = 0;
			for (j = 0; j < k; j++)
				f += l[j];
			
		}
	}
	return OK;
}

【题目】试编写算法,计算i!×2^i的值并存入数组

a[0…n-1]的第i-1个分量中 (i=1,2,…,n)。假设计
算机中允许的整数最大值为MAXINT,则当对某个k
(1≤k≤n)使k!×2^k>MAXINT时,应按出错处理。注意
选择你认为较好的出错处理方法。

Status Series(int a[], int n) 
/* 求i!*2^i序列的值并依次存入长度为n的数组a;     */
/* 若所有值均不超过MAXINT,则返回OK,否则OVERFLOW */
{
    int i,j = 1,k=1;
    for (i = 1;i<=n;i++)
    {
        j *= i;
        k *=2;
        
        if (i<n && (j*k)>= MAXINT / ((i+1)*2))
            return OVERFLOW;
        a[i-1] =  j*k;
    }
    return OK;   
}

【题目】假设有A、B、C、D、E五个高等院校进行田径对抗赛,

各院校的单项成绩均以存入计算机并构成一张表,表中每一行
的形式为:
项目名称 性别 校名 成绩 得分
编写算法,处理上述表格,以统计各院校的男、女总分和团体
总分,并输出。
**********/
相关定义:

typedef enum {female,male} Sex;
typedef struct{
  char *sport;     // 项目名称
  Sex  gender;     // 性别(女:female;男:male)
  char schoolname; // 校名为'A','B','C','D'或'E'
  char *result;    // 成绩
  int score;       // 得分(7,5,4,3,2或1)
} ResultType;

typedef struct{
  int malescore;   // 男子总分
  int femalescore; // 女子总分
  int totalscore;  // 男女团体总分
} ScoreType;

void Scores(ResultType *result, ScoreType *score)
/* 求各校的男、女总分和团体总分, 并依次存入数组score */
/* 假设比赛结果已经储存在result[ ]数组中,            */
/* 并以特殊记录 {"", male, ' ', "", 0 }(域scorce=0)*/
/* 表示结束                                          */
{
    ResultType *r=result;
    ScoreType *s=score;
    
    while (NULL!=r->score)
    {
        int i=r->schoolname-'A';
        //
        if (r->gender==male)
            s[i].malescore+=r->score;
        else
            s[i].femalescore+=r->score;
        s[i].totalscore=s[i].malescore+s[i].femalescore;
        //printf("%c学校总分:%d\n",r->schoolname,s[i].totalscore);
        r++;
    }
}

int i=0;
 while(result[i].sport!=NULL)  
 { 
    switch(result[i].schoolname)     /*使用switch语句记录各院校的成绩*/
    {  
         case 'A':  
             score[0].totalscore+=result[i].score;  
            if(result[i].gender==male)  
                 score[0].malescore+=result[i].score;  
             else  
                score[0].femalescore+=result[i].score;  
             break;  
         case 'B':  
             score[1].totalscore+=result[i].score; 
             if(result[i].gender==male)  
                 score[1].malescore+=result[i].score; 
             else  
                 score[1].femalescore+=result[i].score;  
             break;  
         case 'C':  
             score[2].totalscore+=result[i].score;  
             if(result[i].gender==male)  
                 score[2].malescore+=result[i].score;  
             else  
                 score[2].femalescore+=result[i].score;  
             break;  
         case 'D':  
             score[3].totalscore+=result[i].score;  
             if(result[i].gender==male)  
                 score[3].malescore+=result[i].score;  
             else  
                 score[3].femalescore+=result[i].score;  
             break;  
         case 'E':  
             score[4].totalscore+=result[i].score;  
             if(result[i].gender==male)  
                 score[4].malescore+=result[i].score;  
             else  
                 score[4].femalescore+=result[i].score;  
             break;  

    }  
    i++;  
}  

 int j;  
 for( j=0;j<5;j++)  
 {  
    printf("the school %s: ", result[i].schoolname) ;   /*输出各院校的男女总分和团体总分*/
     printf("total: %f",&score[i].totalscore);  
     printf("male: %f",&score[i].malescore);  
     printf("female: %f",&score[i].femalescore);  
}  


/**********

【题目】试写一算法,对序列S的第i个元素赋以值e。

序列的类型定义为:
typedef struct {
ElemType *elem;
int length;
} Sequence;
***********/

Status Assign(Sequence &S, int i, ElemType e) 
/* 对序列S的第i个元素赋以值e,并返回OK。 */
/* 若S或i不合法,则赋值失败,返回ERROR   */
{
    if (S.elem==NULL)
        return ERROR;
    if  (i > S.length)
        return ERROR;
    S.elem[i]=e;
    return OK; 
}

/**********

【题目】试写一算法,由长度为n的一维数组a构建一个序列S。

序列的类型定义为:

typedef struct {
  ElemType  *elem;
  int  length;
} Sequence;

***********/

Status CreateSequence(Sequence &S, int n, ElemType *a) 
/* 由长度为n的一维数组a构建一个序列S,并返回OK。 */
/* 若构建失败,则返回ERROR                       */
{
     if (n<=0)
        return ERROR;
    //Sequence *s=&S;
    S.length=n;
    S.elem=(ElemType*) malloc (n*sizeof(ElemType));
    
    int i;
    ElemType  *p;
    for (i=0,p=S.elem;p<S.elem+n;p++,i++)
    {
        *p=a[i];
    }
    return OK;
}

/**********

【题目】链表的结点和指针类型定义如下

    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;

试写一函数,构建一个值为x的结点。
***********/

LinkList MakeNode(ElemType x)
/* 构建一个值为x的结点,并返回其指针。*/
/* 若构建失败,则返回NULL。           */
{
    LNode *p;
    p=(LNode*) malloc (sizeof(LNode));
    if (NULL==p)    return NULL;
    p->data=x;
    LinkList L;
    L->next=p;
    return p;
}

/**********

【题目】链表的结点和指针类型定义如下

    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;

试写一函数,构建长度为2且两个结点的值依次为x和y的链表。
**********/

LinkList CreateLinkList(ElemType x, ElemType y) 
/* 构建其两个结点的值依次为x和y的链表。*/
/* 若构建失败,则返回NULL。            */
{
      LNode *p1, *p2;
    p1=(LNode*) malloc (sizeof(LNode*));
     p2=(LNode*) malloc (sizeof(LNode*));
    if (NULL==p1 || NULL==p2)    return NULL;
    p1->data=x;
    p2->data=y;
    LinkList L;
    L=p1;
    L->next=p2;
    return L;
}

/**********

【题目】链表的结点和指针类型定义如下

    typedef struct LNode {
       ElemType  data;
       struct LNode *next;
    } LNode, *LinkList;

试写一函数,构建长度为2的升序链表,两个结点的值
分别为x和y,但应小的在前,大的在后。
**********/

LinkList CreateOrdLList(ElemType x, ElemType y)
/* 构建长度为2的升序链表。  */
/* 若构建失败,则返回NULL。 */
{
    LNode *p1,*p2;
   p1=(LNode*) malloc (sizeof(LNode*));
   p2=(LNode*) malloc (sizeof(LNode*));
    if (NULL==p1 || NULL==p2)    return NULL;
    x<y ? (p1->data=x,p2->data=y) : (p1->data=y,p2->data=x);
    LinkList L;
    L=p1;
    L->next=p2;
    return L;
}

参考链接

  • 10
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 答案是:第二章的数据结构包括栈、队列、链表和散列表。很高兴回答您的问题!以下是我对“广工anyview数据结构答案第二章”的回答: 本章主要介绍了线性表的定义、分类、基本操作以及顺序表和链表两种实现方式。具体内容如下: 1. 线性表的定义:线性表是一种具有相同数据类型的有限序列。 2. 线性表的分类: (1)顺序表:线性表的顺序存储结构,即用一段地址连续的存储单元依次存储线性表的数据元素。 (2)链表:线性表的链式存储结构,即用一组任意的存储单元存储线性表的数据元素。 3. 线性表的基本操作: (1)初始化:建立一个空的线性表。 (2)销毁:释放线性表所占用的内存空间。 (3)插入:在线性表中的指定位置插入一个数据元素。 (4)删除:删除线性表中的指定位置的数据元素。 (5)查找:查找线性表中指定数据元素的位置。 (6)遍历:依次访问线性表中的每个数据元素。 4. 顺序表的实现方式: (1)定义一个一维数组,用来存储线性表中的数据元素。 (2)定义一个变量记录线性表的长度。 (3)各种操作的实现都需要考虑数组下标越界等异常情况。 5. 链表的实现方式: (1)定义一个结构体,包含数据元素和指向下一个节点的指针。 (2)定义一个头指针,用来指向链表的第一个节点。 (3)各种操作的实现需要注意指针的操作以及内存管理问题。 希望这些信息对您有所帮助!如果您有任何其他问题,请随时问我。 ### 回答2: 作为一个语言模型AI,我没有亲身经验来回答该问题,但是我可以为您提供一些基本的知识和原则。希望我的答案能对您有所帮助。 在学习数据结构时,第二章通常是关于算法分析的内容。在这一章中,我们将学习一些关于算法效率和时间复杂度的基本概念。以下是本章中常见的一些内容: 1. 大O符号表示法:大O符号是表示算法时间复杂度的一种常见方法,它指的是算法的最坏情况下的时间复杂度,通常用T(n) = O(f(n))来表示。例如,O(n)表示算法运行时间与输入规模n成正比,O(n^2)表示算法的运行时间与输入规模n的平方成正比。 2. 排序算法:在本章中,我们将介绍几种常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序等。我们将学习这些算法的基本思想、实现方法以及时间复杂度等。 3. 递归算法:递归算法是一种常见的算法思想,它通常用来解决问题的分治和归纳。在本章中,我们将学习递归算法的基本思想、实现方法以及时间复杂度等。 4. 动态规划算法:动态规划算法是一种常见的优化算法,它通常用来解决具有重叠子问题和最优子结构性质的问题。在本章中,我们将学习动态规划算法的基本思想、实现方法以及时间复杂度等。 在学习本章时,我们需要掌握一些基本的数学知识,比如大O符号、函数复合、递归式求解等。同时,我们需要大量的实践来加深理解和掌握本章中的内容。只有通过不断的练习和实践,我们才能真正掌握这些算法和数据结构知识,并在以后的工作和学习中得到应用。 ### 回答3: 广州大学软件工程专业中,数据结构是一门非常重要的基础课程,本课程主要介绍了各种数据结构的基本原理、设计思路及实现方法。而在第二章节中,我们主要学习了线性表数据结构的相关知识。 首先,我们了解到什么是线性表。线性表是一种数据结构,它是由一组数据元素有限、有序的排列方式。即在线性表中,每个数据元素只有唯一的前驱和后继,没有其它分支。线性表的两种最常见的实现方式是顺序存储和链式存储。 然后,我们学习了线性表的顺序存储。在顺序存储结构中,线性表中的数据元素放置在一片连续的存储空间中。这是一个基于数组实现的数据结构,我们可以通过下标来访问它们。 之后,我们深入探讨了线性表的链式存储结构。链式存储结构是通过指针实现的,每个数据元素都有一个指向其后继元素的指针。这里介绍了不同链式结构的实现方式,包括单链表、双向链表、循环链表等。同时,我们也学习了如何通过链表操作来对链表进行插入、删除、查找操作。 最后,我们通过编写代码来巩固所学知识。我们学习了如何实现线性表的顺序存储、单链表以及双向链表,同时也掌握了线性表的基本操作。 总之,线性表是非常重要的数据结构之一,它的应用非常广泛。而在本章中,我们对线性表数据结构有了更加深入的理解,同时通过实践也让我们更加熟悉它们的实现方式及操作。这对于我们往后在算法、数据处理等方面的学习及应用都将非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值