22级数据结构与算法实验2——链表

 1.顺序表的建立及遍历

读入n值及n个整数,建立顺序表并遍历输出。

输入格式:

读入n及n个整数

输出格式:

输出n个整数,以空格分隔(最后一个数的后面没有空格)。

输入样例:

在这里给出一组输入。例如:

4
-3 10 20 78

输出样例:

在这里给出相应的输出。例如:

-3 10 20 78
#include<stdio.h>
#include<stdlib.h>
struct node {
    int data;
    struct node* next;
};
int main()
{
    int i, n; scanf("%d", &n);
    struct node* head, * p, * tail;
    head = (struct node*)malloc(sizeof(struct node));
    head->next = NULL;
    tail = head;
    for (i = 0; i < n; i++)
    {
        p = (struct node*)malloc(sizeof(struct node));
        p->next = NULL;
        scanf("%d", &p->data);
        tail->next=p;
    tail=p;
    }
    p=head->next;
    for (i = 0; i < n; i++)
    {
        if (i == n - 1)
            printf("%d\n", p->data);
        else
            printf("%d ", p->data);
        p = p->next;
    }
    return 0;
}

 2.递增有序顺序表的插入

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。

输入格式:

第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式:

对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例:

在这里给出一组输入。例如:

5
1 3 5 7 9
6

输出样例:

在这里给出相应的输出。例如:

1,3,5,6,7,9,
#include<stdio.h>
int main(){
	int n,i,k,t;
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	scanf("%d",&k);
	if(k<=a[n-1]){
	
	for(i=0;i<n;i++){
		if(k<=a[i])
        {
		t=i;
		break;
		}
	}
	for(i=n;i>=t;i--){
		a[i]=a[i-1];
	}
	n++;
	a[t]=k;
}
	else{
	a[n]=k;
	n++;
	}
	for(i=0;i<n;i++){
		printf("%d,",a[i]);
	}
}

 3. 顺序表(删除)

已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素

输入格式:

输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)

输入样例:

在这里给出一组输入。例如:

10
55 11 9 15 67 12 18 33 6 22
10 20

输出样例:

在这里给出相应的输出。例如:

55 9 67 33 6 22
#include<stdio.h>
int main()
{
    int i,j=0;
    int min,max,n;
    scanf("%d",&n);
    int a[n];
    int b[n];
        for(i=0;i<n;i++)
            b[i]=0;
    for(i=0;i<n;i++)
    
        scanf("%d",&a[i]);
       
    
    scanf("%d%d",&min,&max);
    for(i=0;i<n;i++)
    {
        if(a[i]>=min&&a[i]<=max)
            continue;
        b[j]=a[i];
        j++;
    }
    for(i=0;i<j;i++)
    {
        if(i!=j-1)
            printf("%d ",b[i]);
        else 
        {
            printf("%d",b[i]);
            break;
        }
    }return 0;
}

 4. 数组元素循环右移n位

从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。

在用户输入m和n后,第二行输入相应个数的数组元素。

程序要实现的功能是,让数组元素往右移动n位

例如,数组的5个元素是:1,2,3,4,5。

往右移动1位后:5,1,2,3,4

往右移动2位后:4,5,1,2,3

输入格式:

第一行输入两个整数,第二行输入数组元素。

输出格式:

移动后,数组的每一个元素,注意每个数组元素后有且仅有一个空格。

输入样例:

第一行的数据5和2,表示数组容量为5,让数组元素往右移动2个位置。

第二行是数组的每一个元素的值。

5 2
1 2 3 4 5 

输出样例:

输出移动后的数组元素值,注意每个元素后有且仅有一个空格。

4 5 1 2 3 

#include<stdio.h>
    int main()
{
    int n,m,i,j,k,mid=0;
    scanf("%d %d",&n,&m);
        int a[n];
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<m;i++)
    {
        k=0,j=n-1,mid=a[j];
      while(k!=j)
      {
          a[j-k]=a[j-k-1];
          k++;
      }
        a[0]=mid;
    }
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

5. 最大子列和问题

给定K个整数组成的序列{ N1​, N2​, ..., NK​ },“连续子列”被定义为{ Ni​, Ni+1​, ..., Nj​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20
#include<stdio.h>

int main()
{
	int i,a[100001],n;
	int maxsum,tempsum=0;
	
	scanf("%d\n",&n);
	for(i=0;i<n;i++)
    {
		scanf("%d",&a[i]);
		
	}
	
	for(i=0;i<n;i++){
		tempsum += a[i];
        if(tempsum < 0) tempsum = 0;		
		if(tempsum > maxsum)maxsum = tempsum;
	}
	
	printf("%d",maxsum);
	return 0;
}

 6. 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
#include<stdio.h>
#include<stdlib.h>
typedef struct node *list;
struct node{
    list next;
    int z;
    int x;
};
list read(){
    list head=(list)malloc(sizeof(struct node));
    head->next=NULL;
    list tail=head;
    int i,n;
    int x,z;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        list t=(list)malloc(sizeof(struct node));
        t->next=NULL;
        scanf("%d %d",&x,&z);
        t->z=z;
        t->x=x;
        tail->next=t;
        tail=tail->next;
    }
    
    return head;
}
list addition(list l1,list l2)
{
    list head=(list)malloc(sizeof(struct node));
    head->next=NULL;
    list tail=head;
    list temp1=l1;
    list temp2=l2;
    list t;
    while(temp1&&temp2)
    {
        t=(list)malloc(sizeof(struct node));
        t->next=NULL;
        if(temp1->z==temp2->z)
        {
            t->z=temp1->z;
            t->x=temp1->x + temp2->x;
           temp1=temp1->next;
            temp2=temp2->next;
        }
        else if(temp1->z<temp2->z)
        {
            t->z=temp2->z;
            t->x=temp2->x;
            temp2=temp2->next;
        }
         else if(temp1->z > temp2->z)
         {
              t->z=temp1->z;
             t->x=temp1->x;
             temp1=temp1->next;
         }
        tail->next=t;
        tail=tail->next;
        
    }
   if(temp1!=NULL)   
		tail->next = temp1;
	else if(temp2!=NULL) 
		tail->next = temp2;
	return head->next; 
    
}

list multiplication(list l1, list l2)
{
	list temp1 = l1;
	list temp2 = l2;
	list head = (list)malloc(sizeof(struct node));
	head->next = NULL;
	list tail = head;
	list t;
	for (temp1 = l1; temp1 != NULL; temp1 = temp1->next)
		for (temp2 = l2; temp2 != NULL; temp2 = temp2->next) {
			t = (list)malloc(sizeof(struct node));
			t->x = temp1->x * temp2->x;  
			t->z = temp1->z + temp2->z; 
			t->next = NULL;
			head = addition(tail, t);  
			tail = head;  
		}
	return head;
}
void Print(list l)
{
	list t = l;
	int flag = 1;
	for(t = l;t;t = t->next){
	
            if(!flag && t->x)  
			printf(" ");
				if(t->x){   
			printf("%d %d",t->x,t->z);
			flag =0;	
		}
	}
	if(flag)
		printf("0 0");
	printf("\n");
}
int main(){
	list l1,l2,add,mul;
	l1 = read();
	l2 = read();
	add = addition(l1,l2);
	mul = multiplication(l1,l2);
	Print(mul);
	Print(add);
	return 0;
}

7.合并有序数组 

给定2个非降序序列,要求把他们合并成1个非降序序列。假设所有元素个数为N,要求算法的时间复杂度为O(N)。

输入格式:

输入有4行。
第1行是一个正整数m,表示第2行有m个整数,这些整数构成一个非降序序列,每个整数之间以空格隔开。第3行是一个正整数n,表示第4行有n个整数,这些整数也构成一个非降序序列,每个整数之间以空格隔开。

输出格式:

把第2行的m个整数和第4行的n个整数合并成一个非降序序列,输出这个整数序列。每个数之间隔1个空格。

输入样例:

6
1 3 6 6 8 9  
4
2 4 5 7

输出样例:

1 2 3 4 5 6 6 7 8 9 
#include <iostream>
using namespace std;
 

int main()
{
    
    int m, n;
    cin >> m;
    int a[m];
    for (int i = 0; i < m; i ++ ) 
        cin >> a[i];
    cin >> n;
    int b[n];
    for (int i = 0; i < n; i ++ )
        cin >> b[i];
      
    int i = 0, j = 0, k = 0;
    int c[m+n]={0};
    while (i < m && j < n)
    {if (a[i] <= b[j])
            c[k ++ ] = a[i ++ ];                    
        else c[k ++ ] = b[j ++ ];
    }
    while (i < m) 
        c[k ++ ] = a[i ++ ];
    while (j < n) 
        c[k ++ ] = b[j ++ ];
 
    for (int i = 0; i < k; i ++ ) cout << c[i] << ' ';
 
 
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值