感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~
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;
}