吉林大学超星MOOC高级语言程序设计 实验09(2021级)

程设的最后一次作业了,哈哈哈,我的代码其实不是补全的代码,基本都是重写的。我不太喜欢一堆*****的写法。然后祝大家机试的ak,笔试的满绩!

1. (程序题)

题目编号:Exp09-Enhance01

题目名称:单链表倒数第K个结点

题目描述:请填写缺失代码完成程序,实现如下功能:

    首先根据键盘随机输入,以0结束的若干非零整数建立单链表;

    然后根据输入的整数K,输出链表倒数第K个结点的值,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符;

    若不存在则输出NULL。

例如,

    输入:1 2 3 4 5 6 7 8 0 3

    输出:6

    输入:0 2 3 4 5 6 7 8 0 3

    输出:NULL

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node*)malloc(sizeof(node));
	scanf("%d",&head->data);
	head->next=NULL;
	if(head->data==0){
		return NULL; 
	}
	p=head; 
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		q=(node*)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
} 
lnode find_k(lnode l,int k){
	lnode p=NULL;
	p=l;
	int n=0;
	while(p){
		n++;
		p=p->next;
	}
	p=l;
	k=n-k;
	if(k<=0){
		return NULL;
	}
	while(k>0){
		p=p->next;
		k--;
	}
	return p;
}
void release(lnode l){
	lnode p,q;
	p=l;
	while(p){
		q=p;
		p=p->next;
		free(q);
	}
}
int main(){
	lnode head=create();
	lnode res;
	int k;
	scanf("%d",&k);
	res=find_k(head,k);
	if(res){
		printf("%d",res->data);
	}else{
		printf("NULL");
	}
	release(head);
}

2. (程序题)

题目编号:Exp09-Basic04

题目名称:单链表交换两结点

题目描述:请填写缺失代码完成程序,实现如下功能:

首先根据键盘随机输入,以0结束的若干非零整数建立单链表;

然后根据输入的两个索引位置交换链表上的两个结点(链表首元素索引为1,且要交换的两个索引位置不相邻);

最后链表各结点值输出,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符。

若是空链表,则输出NULL。

例如,

输入:1 2 3 4 5 6 0 1 5

输出:5 2 3 4 1 6

输入:0 1 2 3 4 5 6 0 1 5

输出:NULL

#include <stdio.h>//此题的链表构造方式与之前的不太一样头节点是一个不存数据的结点
#include <malloc.h>//目的是当交换第一个数据的时候更加方便
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
int n;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node *)malloc(sizeof(node));
	p=head;
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		n++;
		q=(node *)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
} 
lnode swap(lnode l,int x,int y){
	lnode p,q=NULL,q1=NULL,q1pre=NULL,q2=NULL,q2pre=NULL,tmp=NULL;
	p=l;
	if(x>n||y>n||x<=0||y<=0||l==NULL){
		return NULL;
	}
	while(p){
		if(x==0){
			q1=p;
			q1pre=q;
			break;
		}
		x--;
		q=p;
		p=p->next;
    }
    p=l;
	while(p){
		if(y==0){
			q2=p;
			q2pre=q;
			break;
        }
        y--;
        q=p;
        p=p->next;
	}
	tmp=q2->next;
	q1pre->next=q2;
	q2->next=q1->next;
	q2pre->next=q1;
	q1->next=tmp;
	return l;
}
void print(lnode l){
	lnode p;
	p=l->next;
	while(p->next){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("%d",p->data);
}
void release(lnode l){
	lnode p,q;
	p=l;
	while(p){
		q=p;
		p=p->next;
		free(q);
	}
}
int main(){
	lnode head,res;
	head=create();
	int x,y;
	scanf("%d %d",&x,&y);
	res=swap(head,x,y);
	if(res&&n!=0){
		print(res);
	}else{
		printf("NULL");
	}
	release(head);
}

3. (程序题)

题目编号 :Exp09-Basic05,GJBook3例-13-04

题目名称:单链表存储法雷序列

题目描述:请填写缺失代码完成程序,实现如下功能:

给定一个正整数n,用单链表递增存储n阶法雷序列各项值。n阶法雷序列是把所有不可约分的分数j/i(0<i≤n; 0≤j≤i)递增排序的序列。

输入一个正整数n;输出n阶法雷序列各项分数形式,分数的分子和分母间以/连接,各个分数间以一个西文空格间隔,最后一个数字后无任何字符。若是空链表或n不符合要求,则输出NULL。

例如,

输入:3 

输出:0/1 1/3 1/2 2/3 1/1

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int a,b;
	struct node * next;
}node,*lnode;
int gcd(int x,int y){
	int z=y;
	while(x%y!=0){
		z=x%y;
		x=y;
		y=z;	
	}
	return z;
}
int n;
lnode create(){
	int i,j;
	if(n<1){
		return NULL;
	}
	lnode head=NULL,p=NULL,r=NULL,r0=NULL,tmp=NULL;
	head=(node *)malloc(sizeof(node));
	head->a=0;
	head->b=1;
	head->next=NULL;
	p=(node *)malloc(sizeof(node));
	p->a=1;
	p->b=1;
	p->next=NULL;
	head->next=p;
	r=head->next;
	r0=head;
	while(r){
		i=r->a+r0->a;
		j=r->b+r0->b;
		if(j<=n&&gcd(i,j)==1){
			tmp=(node*)malloc(sizeof(node));
			tmp->a=i;
			tmp->b=j;
			r0->next=tmp;
			tmp->next=r;
			r=tmp;
		}else{
			r=r->next;
			r0=r0->next;
		}
	}
	return head;
}
void print(lnode l){
	lnode p=NULL;
	p=l;
	while(p->next){
		printf("%d/%d ",p->a,p->b);
		p=p->next;
	}
	printf("%d/%d",p->a,p->b);
}
int main(){
	scanf("%d",&n);
	lnode head=NULL;
	head=create();
	if(head){
		print(head);
	}else{
		printf("NULL");
	}
}

4. (程序题)

题目编号:Exp09-Enhance03

题目名称:合并单链表

题目描述:请填写缺失代码完成程序,实现如下功能:

    首先从键盘输入一行以0结束的若干非零整数,建立一个单链表,输入的整数顺序为数字非递减顺序;

    然后以同样的方式,仍在第一行继续输入并建立第二个单链表;

    之后将两个链表合并形成一个新链表,使得新链表依然保持数字非递减顺序;

    最后验证输出新链表所有值,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符。若是空链表,则输出NULL。

例如,

    输入:2 3 4 4 5 6 0 1 3 4 6 7 0

    输出:1 2 3 3 4 4 4 5 6 6 7

    输入:0 0

    输出:NULL

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node*)malloc(sizeof(node));
	scanf("%d",&head->data);
	if(head->data==0){
		return NULL; 
	}
	p=head; 
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		q=(node*)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
} 
lnode combine(lnode l1,lnode l2){
	if(l1==NULL&&l2==NULL){
		return NULL;
	}
	if(l1&&l2==NULL){
		return l1;
	}
	if(l2&&l1==NULL){
		return l2;
	}
	lnode p=l1,q=l2,l3=NULL,p3=NULL,q3=NULL;
	l3=(node*)malloc(sizeof(node));
	if(p->data<q->data){
		l3->data=p->data;
		p=p->next;
		l3->next=NULL;
	}else{
		l3->data=q->data;
		q=q->next;
		l3->next=NULL;
	}
	p3=l3;
	while(p&&q){
		if(p->data<q->data){
			q3=(node*)malloc(sizeof(node));
			q3->data=p->data;
			q3->next=NULL;
			p3->next=q3;
			p3=q3;
			p=p->next;
		}else{
			q3=(node*)malloc(sizeof(node));
			q3->data=q->data;
			q3->next=NULL;
			p3->next=q3;
			p3=q3;
			q=q->next;
		}
	}
	while(p){
		q3=(node*)malloc(sizeof(node));
		q3->data=p->data;
		q3->next=NULL;
		p3->next=q3;
		p3=q3;
		p=p->next;
	}
	while(q){
		q3=(node*)malloc(sizeof(node));
		q3->data=q->data;
		q3->next=NULL;
		p3->next=q3;
		p3=q3;
		q=q->next;
	}
	return l3;
}
void release(lnode l){
	lnode p,q;
	p=l;
	while(p){
		q=p;
		p=p->next;
		free(q);
	}
}
void print(lnode l){
	lnode p;
	p=l;
	while(p->next){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("%d",p->data);
}
int main(){
	lnode l1=NULL,l2=NULL;
	l1=create();
	l2=create();
	lnode l3=NULL;
	l3=combine(l1,l2);
	if(l3){
		print(l3);
	}else{
		printf("NULL");
	}
	release(l3);
}

5. (程序题)

题目编号:Exp09-Basic02,GJBook3-13-06

题目名称:删除单链表重复结点

题目描述:请填写缺失代码完成程序,实现如下功能:

首先根据键盘随机输入,以0结束的若干非零整数建立单链表;然后删除此链表中值重复的结点仅保留一个,且不改变原有结点顺序;最后将删除后链表中各结点值输出,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符;若是空链表,则输出NULL。

例如,

输入:5 4 2 1 3 0 输出:5 4 2 1 3

输入: 4 2 1 3 3 2 0 输出:4 2 1 3

输入: 0 4 2 3 2 0 输出:NULL

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node*)malloc(sizeof(node));
	scanf("%d",&head->data);
	head->next=NULL;
	if(head->data==0){
		return NULL; 
	}
	p=head;
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		q=(node*)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
}
lnode del(lnode l){
	lnode p=NULL;
	p=l;
	while(p){
		lnode q=NULL,tmp=NULL,d=NULL;
		tmp=p; 
		q=p->next;
		while(q){
			if(q->data==p->data){
				if(q->next==NULL){
					tmp->next=NULL;
				}else{
					tmp->next=q->next;
				}
				d=q;
				q=q->next;
				free(d); 
			}else{
				tmp=q;
				q=q->next;
			}
		}
		p=p->next;
	}
	return l;
}
void print(lnode l){
	lnode p;
	p=l;
	while(p->next){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("%d",p->data);
}
void release(lnode l){
	lnode p,q;
	p=l;
	while(p){
		q=p;
		p=p->next;
		free(q);
	}
}
int main(){
	lnode head=NULL,res=NULL;
	head=create();
	res=del(head);
	if(res){
		print(res);
	}else{
		printf("NULL");
	}
	release(head);
}

6. (程序题)

题目编号:Exp09-Basic01

题目名称:创建单链表

题目描述:请填写缺失代码完成程序,实现如下功能:

根据从键盘随机输入以0结束的若干非零整数,建立一个单链表;之后将此链表中保存的数字顺次输出,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符;若是空链表,则输出NULL。

例如, 

输入:5 4 2 1 3 0 

输出:5 4 2 1 3

输入:0 5 4 2 1 3 0 

输出:NULL

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node*)malloc(sizeof(node));
	scanf("%d",&head->data);
	head->next=NULL;
	if(head->data==0){
		return NULL; 
	}
	p=head;
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		q=(node*)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
}
void print(lnode l){
	lnode p=l;
	while(p->next){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("%d",p->data);
}
void release(lnode l){
	lnode tmp,p;
	tmp=p=l;
	while(p){
		tmp=p;
		p=p->next;
		free(tmp);
	}
}
int main(){
	lnode head;
	head=create();
	if(head){
		print(head);
	}else{
		printf("NULL"); 
	}
	release(head);
}

7. (程序题)

题目编号 :Exp09-Basic03

题目名称:求单链表中间结点

题目描述:请填写缺失代码完成程序,实现如下功能:

首先根据键盘随机输入,以0结束的若干非零整数建立单链表;

然后寻找处于链表中间位置的结点,若中间结点有两个,则设定前一个为中间位置结点;

最后将从中间结点开始到链表尾各结点值输出,相邻数字间以一个西文空格间隔,最后一个数字后无任何字符。

若是空链表,则输出NULL。

例如,

输入:5 4 2 1 3 0 

输出:2 1 3

输入: 4 2 1 3 3 2 0 

输出:1 3 3 2

#include <iostream>
using namespace std;
typedef struct node{
	int data;
	struct node *next;
}node,*lnode;
lnode create(){
	lnode head=NULL,p=NULL,q=NULL;
	head=(node*)malloc(sizeof(node));
	scanf("%d",&head->data);
	head->next=NULL;
	if(head->data==0){
		return NULL; 
	}
	p=head; 
	while(1){
		int ele;
		scanf("%d",&ele);
		if(ele==0){
			break;
		}
		q=(node*)malloc(sizeof(node));
		q->data=ele;
		q->next=NULL;
		p->next=q;
		p=q;
	}
	return head;
} 
lnode findmid(lnode l){
	lnode p=l;
	int n=0;
	if(l==NULL){
		return NULL;
	}
	while(p){
		n++;
		p=p->next; 
	} 
	p=l;
	int k=0;
	n%2==0?k=n/2-1:k=n/2;
	for(int i=0;i<k;i++){
		p=p->next;
	}
	return p;
}
void print(lnode l){
	lnode p=NULL;
	p=l;
	while(p->next){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("%d",p->data);
}
void release(lnode l){
	lnode p=NULL,q=NULL;
	p=q=l;
	while(p){
		q=p;
		p=p->next;
		free(q);
	}
}
int main(){
	lnode head=NULL;
	head=create();
	lnode p=NULL;
	p=findmid(head);
	if(p){
		print(p);
	}else{
		printf("NULL");
	}
	release(head);
}

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值