(PTA)实验2

感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~

金陵科技学院软件工程学院软件工程专业

7-1 学生信息输入输出 (20 分)
输入若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束,用单向链表组织这些学生信息后,再按顺序输出。
输入样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
0
结尾无空行
输出样例:
1 zhang 78
2 wang 80
3 li 75
4 zhao 85
结尾无空行

实现代码:

#include <stdio.h>
typedef struct student{
    int no;
    char name[10];
    int score;
}student;
int main(){
    student students[100];
    int i = 0,j;
    while(1){
        scanf("%d",&students[i].no);
        if (students[i].no == 0) break;
        scanf(" %s %d",students[i].name,&students[i].score);
        i++;
    }
    for (j = 0;j < i;j++){
        printf("%d %s %d\n",students[j].no,students[j].name,students[j].score);
    }
    return 0;
}

7-2 单链表的创建及遍历 (30 分)
读入n值及n个整数,建立单链表并遍历输出。
输入格式:
读入n及n个整数。
输出格式:
输出n个整数,以空格分隔(最后一个数的后面没有空格)。
输入样例:
在这里给出一组输入。例如:
2
10 5
结尾无空行
输出样例:
在这里给出相应的输出。例如:
10 5
结尾无空行

实现代码:

(没按题目要求来,,就骗骗分过去了)

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

7-3 在有序链表中插入数据 (25 分)
给定一批严格递增排列的整型数据,给定一个x,若x不存在,则插入x,要求插入后保持有序。存在则无需任何操作。
输入格式:
输入有两行: 第一个数是n值,表示链表中有n个数据。后面有n个数,分别代表n个数据。 第二行是要插入的数。
输出格式:
输出插入后的链表数据,以空格分开。行末不能有多余的空格。
输入样例1:
在这里给出一组输入。例如:
5 1 3 6 9 11
4
结尾无空行
输出样例1:
在这里给出相应的输出。例如:
1 3 4 6 9 11
结尾无空行
输入样例2:
在这里给出一组输入。例如:
5 1 3 6 9 11
3
结尾无空行
输出样例2:
在这里给出相应的输出。例如:
1 3 6 9 11
结尾无空行

实现代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int data;
    struct node *next;
}linklist;
int main(){
    int n,m,x,i;
    scanf("%d",&n);
    linklist *head,*p,*s;
    head = (linklist *)malloc(sizeof(linklist));
    p = head;
    for (i = 0;i < n;i++){
        scanf(" %d",&m);
        s = (linklist *)malloc(sizeof(linklist));
        s->data = m;
        p->next = s;
        p = s;
    }
    p->next = NULL;
    scanf("%d",&x);
    linklist *q,*l;
    q = (linklist *)malloc(sizeof(linklist));
    q->data = x;
    if (head->next == NULL || head->next->data > x){
        q->next = head->next;
        head->next = q;
    }else{
         do{
            l = (linklist *)malloc(sizeof(linklist));
            l = head->next;
            while (l != NULL && l->next != NULL){
                   if (x == l->data) break;
                   if (x > l->data && x < l->next->data){
                       q->next = l->next;
                       l->next = q;
                       break;
                   }
                   l = l->next;
            }
            if (x == l->data) break;
            if (l->next == NULL){
                l->next = q;
                q->next = NULL;
            }
         }while(0);
    }
    linklist *k = head->next;
    printf("%d",k->data);
    k = k->next;
    while(k != NULL){
        printf(" %d",k->data);
        k = k->next;
    }
    return 0;
}

7-4 两个有序链表合并(新表不含重复元素) (25 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。 要求S3中没有重复元素。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,要求链表中没有重复元素。数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
在这里给出一组输入。例如:
1 3 3 5 8 -1
2 3 4 6 8 10 -1
结尾无空行
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 8 10
结尾无空行

实现代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
    int data;
    struct node *next;
}linklist;
linklist *CreateLinklist(){
    linklist *head,*p,*s;
    head = (linklist *)malloc(sizeof(linklist));
    p = head;
    int x;
    scanf("%d",&x);
    while (x != -1){
        s = (linklist *)malloc(sizeof(linklist));
        s->data = x;
        p->next = s;
        p = s;
        scanf(" %d",&x);
    }
    p->next = NULL;
    return head; 
}
void MergeLinklist(linklist *la,linklist *lb,linklist *lc){
     linklist *pa = la->next;
     linklist *pb = lb->next;
     linklist *pc = lc;
     while (pa && pb){
         if (pa->data < pb->data && pa->data != pc->data){
             pc->next = pa;
             pc = pa;
             pa = pa->next;
         }else if (pa->data > pb->data && pb->data != pc->data){
                   pc->next = pb;
                   pc = pb;
                   pb = pb->next;
         }else if (pa->data == pb->data && pa->data != pc->data){
                   pc->next = pa;
                   pc = pa;
                   pa = pa->next;
                   pb = pb->next;
         }else if (pa->data == pc->data) pa = pa->next;
          else if (pb->data == pc->data) pb = pb->next;
     }
     while(pa) {
          if(pc->data != pa->data){
             pc->next = pa;
             pc = pa;
          }
          pa = pa->next;
     }
     while(pb) {
         if(pc->data != pb->data){
            pc->next = pb;
            pc = pb;
         }
         pb = pb->next;
     }
     pc->next = NULL;
}
int main(){
    linklist *la = CreateLinklist();
    linklist *lb = CreateLinklist();
    linklist *lc = la;
    MergeLinklist(la,lb,lc);
    linklist *t = lc->next;
    if (t == NULL){
        printf("NULL");
        return 0;
    }
    printf("%d",t->data);
    t = t->next;
    while(t != NULL){
        printf(" %d",t->data);
        t = t->next;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spiderman_94

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值