bayd1602 2023-10-15 19:25 采纳率: 100%
浏览 3
已结题

数据结构动态分配顺序表

输入格式
第一行两个正整数 n、m,其中n表示员工个数,m表示操作次数
接下来n行,每行包含一名员工信息,即姓名:name、职务:position、工号:id
接下来m行,每行首先会有两个正整数op, x
若op = 1,表示线性表中在位置x的员工离职
若op = 2, 表示有员工入职,需要将员工置入线性表中的位置x处,接下来会输入两个字符串和一个正整数代表入职员工的name, position, id
若op = 3,表示查询位置x处员工的信息

输入保证
1 <= n, m <= 1000
name, postion 为长度不超过50的字符串
id为一整型变量,满足1 <= id <= 1000000
x为正整数,不会超出整型变量值域范围
输入中不会有两名员工有完全的相同信息

输出格式
对于每一个操作输出一行,如果位置x超出当前线性表的范围,输出-1
否则对于入职与离职操作,输出操作后线性表的结构,如下图所示
name_1 postion_1 id_1 name_2 position_2 id_2 ... name_m positon_m id_m
m表示输出时线性表中存在的总人数
对于查询操作,输出对应位置员工信息 name_x position_x id_x

样例输入
3 6
alice manager 1
bob staff 2
tom staff 3
1 2
2 3 lily staff 4
2 10 bob consultant 10
3 2
2 2 bob consultant 1000
3 1000

样例输出
alice manager 1 tom staff 3
alice manager 1 tom staff 3 lily staff 4
-1
tom staff 3
alice manager 1 bob consultant 1000 tom staff 3 lily staff 4
-1

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
struct worker{
    char name[50],position[50];
    int id;
}; 
struct worker *shuru(){
    int i=0;
     char t;
     struct worker *p;
     p=(struct worker*)malloc(sizeof(struct worker));
     scanf("%s%s",&p->name,&p->position);
     scanf("%d",&p->id);
     return p;
}; 

 void shuchu(struct worker *p)
 {
     printf("%s %s %d ",p->name,p->position,p->id);
 }
int main(){
    
    int n,m,i,x,d,op,t;
    char na[50],po[50];
    scanf("%d%d",&n,&m);
    struct worker *p[1000];
    for(i=0;i<n;i++)
     {
         p[i]=shuru();
     }
     for(i=1;i<=m;i++){
         scanf("%d%d",&op,&x);
         if(x>n){printf("-1\n");break;}
         if(op==1){for(t=x-1;t<n;t++)p[t]=p[t+1];n--;
                  for(t=0;t<n;t++)shuchu(p[t]);printf("\n");
         }
        if(op==2){for(t=n;t>=x;t--){p[t]=p[t-1];
        }
                  scanf("%s%s%d",&p[x-1]->name,&p[x-1]->position,&p[x-1]->id);n++;
                for(t=0;t<=n-1;t++)shuchu(p[t]);
         }
        if(op==3){
         shuchu(p[x-1]);printf("\n");
         }
         
         }
         
     
    

    

    return 0;
}

实在是不知道哪错了 求解答

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-10-16 16:03
    关注

    供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXLEN 100
    typedef struct worker {
        char name[50], position[50];
        int  id;
    }ElemType;
    
    typedef struct seqList {
        ElemType* elem;
        int     Length;
        int     maxLength;
    }SeqList;
    
    void PrintList(SeqList L)
    {
        int i;
        for (i = 0; i < L.Length; i++)
            printf(i ? " %s_%d %s_%d %d_%d" : "%s_%d %s_%d %d_%d",
                L.elem[i].name, i + 1, L.elem[i].position, i + 1, L.elem[i].id, i + 1);
        printf("\n");
        return;
    }
    void InitSeqList(SeqList* L)
    {
        L->elem = (ElemType*)malloc(sizeof(ElemType) * MAXLEN);
        if (!L->elem)  return;
        L->Length = 0;
        L->maxLength = MAXLEN;
    }
    void InputSeqList(SeqList* L, int n)
    {
        int i;
        for (i = 0; i < n; i++) {
            scanf("%s %s %d", L->elem[i].name, L->elem[i].position, &L->elem[i].id);
            getchar();
            L->Length++;
        }
    }
    void DelSeqList(SeqList* L, int i)  // 离职
    {
        int k;
        if (i < 1 || i > L->Length) {
            printf("-1\n");
            return;
        }
        for (k = i; k < L->Length; k++)
            memcpy(&L->elem[k - 1], &L->elem[k], sizeof(ElemType));
        L->Length--;
        PrintList(*L);
        return;
    }
    void AddSeqList(SeqList* L, int i, ElemType data) // 入职
    {
        int k;
        if (i < 1 || i > L->Length + 1 || L->Length > L->maxLength - 1) {
            printf("-1\n");
            return;
        }
        for (k = L->Length; k >= i; k--)
            memcpy(&L->elem[k], &L->elem[k - 1], sizeof(ElemType));
        memcpy(&L->elem[i - 1], &data, sizeof(ElemType));
        L->Length++;
        PrintList(*L);
        return;
    }
    void GetElemList(SeqList* L, int i)
    {
        if (i < 1 || i > L->Length) {
            printf("-1\n");
            return;
        }
        printf("%s %s %d\n", L->elem[i - 1].name, L->elem[i - 1].position, L->elem[i - 1].id);
        return;
    }
    
    int main()
    {
        int n, m, op, x;
        ElemType data;
        SeqList L;
        scanf("%d %d", &n, &m);
        InitSeqList(&L);
        InputSeqList(&L, n);
        while (m--) {
            scanf("%d %d", &op, &x);
            getchar();
            switch (op)
            {
            case 1:
                DelSeqList(&L, x);
                break;
            case 2:
                scanf("%s %s %d", data.name, data.position, &data.id);
                AddSeqList(&L, x, data);
                break;
            case 3:
                GetElemList(&L, x);
                break;
            default:
                break;
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月10日
  • 已采纳回答 12月2日
  • 创建了问题 10月15日

悬赏问题

  • ¥15 Android Navigation: 某XDirections类不能自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)