SDUT数据结构pta-顺序表

7-1 顺序表的建立及遍历

#include<stdio.h>
#include<stdlib.h>
#define max 100
typedef struct {
    int *data;
    int length;
}sqlist;
int initlist(sqlist *l)
{
    l->data=(int *)malloc(max*sizeof(int));
    l->length=0;
    return 1;
}
void creatsq( sqlist *l)
{
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&l->data[i]);
        l->length++;
    }
}
void printsq( sqlist *l)
{
    int i;
    for(i=0;i<l->length;i++)
    {
        if(i!=0)printf(" ");
        printf("%d",l->data[i]);
    }
}
int main()
{
     sqlist l;
    initlist(&l);
    creatsq(&l);
    printsq(&l);
    return 0;
}

7-2 递增有序顺序表的插入

#include<stdio.h>
#include<stdlib.h>
#define max 100000
typedef struct{
    int* data;
    int length;
}list;
int initlist(list *l)
{
    l->data=(int *)malloc(max*(sizeof(int)));
    l->length=0;
    return 1;
}
void creatlist(list *l)
{
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&l->data[i]);
        l->length++;
    }
}
int findlist(list *l)
{
    int x,i=0,j,p,len;
    scanf("%d",&x);
    while(i < l->length && x >= l->data[i])
    {
        i++;
    }
    p = i;
    if((i<0)||(i>l->length+1))return 0;
    if(i == max)return 0;
    for(j=l->length-1;j>=p;j--)
    {
        l->data[j+1]=l->data[j];
    }
    l->data[p]=x;
    l->length++;
    return 1;
}
void printlist(list *l)
{
    int i;
    for(i=0;i<l->length;i++)
    {
        if(i!=0)printf(",");
        printf("%d",l->data[i]);
    }
    printf(",");
}
int main()
{
    list l;
    initlist(&l);
    creatlist(&l);
    findlist(&l);
    printlist(&l);
}

7-3 顺序表(删除)

#include<stdio.h>
#include<stdlib.h>
#define max 1000
typedef struct{
    int* data;
    int length;
}list;
int initlist(list *l){
    l->data=(int*)malloc(max*(sizeof(int)));
    l->length=0;
}
void creatlist(list *l){
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&l->data[i]);
        l->length++;
}
}
void delelist(list *l)
{
    int m,p,i,j,e;
    j=l->length;
    scanf("%d %d",&m,&p);
    i = 0;
    while (i < j) {
        if (l->data[i] >= m && l->data[i] <= p) {
            for (e = i; e < j - 1; e++) {
                l->data[e] = l->data[e + 1];
            }
            j--;
        } else {
            i++;
        }
    }
    l->length = j;
}
void printlist(list *l){
    int i;
    for(i=0;i<l->length;i++)
    {
        if(i==0)printf("%d",l->data[i]);
        else printf(" %d",l->data[i]);
    }
}
int main()
{
        list l;
        initlist(&l);
        creatlist(&l);
        delelist(&l);
        printlist(&l);
}

7-4 最大子列和问题

#include<stdio.h>
int main()
{
    int n,i,ssum=0,qsum=0;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++){
        ssum+=a[i];
        if(ssum<0){
            ssum=0;
        }
        if(ssum>qsum)
            qsum=ssum;
    }
    if(qsum<0)printf("0");
    else printf("%d",qsum);
}

7-5 数组元素循环右移n位

#include<stdio.h>
#include<stdlib.h>
#define max 100
int main()
{
    int n,m,i,j,p,t;
    scanf("%d %d",&n,&m);
    int a[max];
    int b[max];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    p=m%n;
    for(i=0;i<n;i++)
    {
        b[(p+i)%n]=a[i];
    }
    for(i=0;i<n;i++)
    {
        printf("%d ",b[i]);
    }
}

7-6 单词逆置

#include<stdio.h>
#include<string.h>
int main()
{
    long long int t;
    scanf("%lld",&t);
    getchar();
    while(t--)
    {
        char a[81];
        int i,j=0;
        int m,n=0;
        gets(a);
        int len=strlen(a);
        for(i=0;i<len;i++)
        {
            if(a[i]==' ')
            {
                m=i;
                for(j=m-1;j>=n && a[j] != ' ';j--) // 添加条件判断,确保不输出空格
                {
                    printf("%c",a[j]);
                }
                printf(" "); // 输出空格分隔单词
                n=m+1;
            }
        }
        for (j = len - 1; j >= n && a[j] != ' '; j--) { // 添加条件判断,确保不输出空格
            printf("%c",a[j]);
        }
        printf("\n"); // 添加换行符以分隔每个测试用例的输出
    }
}

7-7 一元多项式的乘法与加法运算

#include<stdio.h>
#define max 10000
int a[max];
int b[max];
int mu[max];
int sum[max];
int main()
{
    int m,n,i,j,cnt=0;
    scanf("%d",&n);
    int x,y;
    while(n--){
        scanf("%d %d",&x,&y);
            a[y]=x;
    }
    scanf("%d",&m);
    int q,w;
    while(m--){
        scanf("%d %d",&q,&w);
        b[w]=q;
    }
    for(i=0;i<max;i++)
    {
        if(a[i]){
            for(j=0;j<max;j++){
                if(b[j]){
                    mu[i+j]=mu[i+j]+a[i]*b[j];
                }
            }
        }
    }
    for(i=0;i<max;i++)
    {
        if(a[i])
        sum[i]+=a[i];
    }
    for(j=0;j<max;j++)
    {
        if(b[j])
        sum[j]+=b[j];
    }
    cnt=0;
    for(i=max-1;i>=0;i--){
        if(mu[i]){
        if(cnt!=0)
            printf(" ");
            printf("%d %d",mu[i],i);
            cnt++;
    }
    }
    if(cnt==0)printf("0 0");
    printf("\n");
    cnt=0;
    for(i=max-1;i>=0;i--)
    {
        if(sum[i]){
        if(cnt!=0)
            printf(" ");
            printf("%d %d",sum[i],i);
            cnt++;
        }
    }
    if(cnt==0)printf("0 0");
}

7-8 一元多项式的加法

#include<bits/stdc++.h>
#define ll long long
#define eb emplace_back
#define x first
#define y second
const int N = 1e7 + 10;
using namespace std;

map<ll,ll>ind;
vector<ll>res;

void solve(){
    int n;
    cin>>n;
    int a,b;
    for(int i=1;i<=n;i++){ // 输入第一个表达式
        cin>>a>>b;
        ind[b]+=a;  // 对应指数位置加上系数值
    }
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a>>b;
        ind[b]+=a;
    }
    for(auto i:ind){  // 遍历指数 去除系数为零的指数
        if(i.y){
            res.eb(i.x);
            res.eb(i.y);
        }
    }
    if(res.size()){  // 如果不是零多项式 倒序输出
        for(int i=res.size()-1;i>=0;i--){
            if(i!=res.size()-1) cout<<" ";
            cout<<res[i];
        }
        cout<<endl;
    }else cout<<"0 0"<<endl;  // 如果是零多项式 输出 0 0
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

7-9 合并有序数组

#include<stdio.h>
int main()
{
    int n, m;
    scanf("%d", &n);
    int a[n];
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &m);
    int b[m];
    for (int i = 0; i < m; i++)
        scanf("%d", &b[i]);
    int w[n + m];
    int i = 0, j = 0, k = 0;
    while (i < n && j < m) {
        if (a[i] <= b[j]) {
            w[k++] = a[i++];
        } else {
            w[k++] = b[j++];
        }
    }
    while (i < n) {
        w[k++] = a[i++];
    }
    while (j < m) {
        w[k++] = b[j++];
    }
    for (int i = 0; i < n + m; i++) {
        
            printf("%d ", w[i]);
        
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值