题目:合并两个链表,有序输出合并后(升序)的链表

输入:list1=5 4 3 2 1, list2=10 9 8 7 6

输出:1 2 3 4 5 6 7 8 9 10

优化目标:无

创建LinkListMerge.h文件,声明相关API

#ifndef LINKLIST_MERGE_H
#define LINKLIST_MERGE_H

#include <stdio.h>
#include <stdlib.h>
//链表结点
typedef struct LINKNODE{
	int data;
	struct LINKNODE* next;
}LinkNode;

//链表
typedef struct LINKLIST{
	LinkNode* head;
	int size;
}LinkList;

//初始化链表
LinkList* Init_LinkList();
//插入
void Insert_LinkList(LinkList* list, int pos, int data);
//合并
LinkList* Merge_LinkList(LinkList* list1, LinkList* list2);
//排序
LinkList* Sort_LinkList(LinkList* list);
//day
void Print_LinkList(LinkList* list);
#endif

创建LinkListMerge.c文件,定义相关API

#include "LinkListMerge.h"

//初始化链表
LinkList* Init_LinkList(){
	//初始化
	LinkList* list = (LinkList*)malloc(sizeof(LinkList));
	list->size = 0;
	
	//初始化头节点
	list->head = (LinkNode*)malloc(sizeof(LinkNode));
	list->head->data = NULL;
	list->head->next = NULL;
	return list;
}
/*
*插入
*@list:链表指针
*@pos:插入位置
*@data:插入的数据
*/
void Insert_LinkList(LinkList* list, int pos, int data){
	//判断参数的合法性
	if (list == NULL) {
		return;
	}
	if (data == -1) {
		return;
	}
	//如果pos不合法,默认插入链尾
	if (pos < 0 || pos > list->size) {
		pos = list->size;
	}
	
	//创建新结点
	LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
	newNode->data = data;
	newNode->next = NULL;
	
	//找到插入位置的前一个结点,用辅助指针指向
	LinkNode* pCurrent = list->head;
	for(int i=0; i<pos; i++){
		pCurrent = pCurrent->next;
	}
	
	//插入结点
	newNode->next = pCurrent->next;
	pCurrent->next = newNode;
	
	list->size++;
}

/*
*合并
*@list1:链表指针
*@list2:链表指针
*/
LinkList* Merge_LinkList(LinkList* list1, LinkList* list2){
	//判断参数的合法性
	if(list1 == NULL && list2 == NULL){
		return NULL;
	}
	//如果有一个链表为空,则直接返回另一个
	if(list1 != NULL && list2 == NULL){
		return list1;
	}
	if(list1 == NULL && list2 != NULL){
		return list2;
	}
	//两个都不为空,直接把list2的第一个数据结点链接到list1的最后一个结点上
	LinkNode* pCurrent = list1->head;
	//找到list1的链尾
	for(int i=0; i<list1->size; i++){
		pCurrent = pCurrent->next;
	}
	
	//把list2链接到list1上,返回list1
	pCurrent->next = list2->head->next;
	list1->size += list2->size;
	return list1;
}

/*
*排序
*@list:链表指针
*/
LinkList* Sort_LinkList(LinkList* list){
	//判断参数的合法性
	if(list == NULL){
		return NULL;
	}
	//冒泡排序
	for(int i=0; i<list->size-1; i++){
		LinkNode* p = list->head->next;
		LinkNode* q = p->next;
		
		for(int j=list->size-i-1; j>0; j--){
			if(p->data > q->data){
				int tmp=q->data;
				q->data=p->data;
				p->data=tmp;
			}
			p = p->next;
			q = q->next;
		}
	}
	
	return list;
}

/*
*打印
*@list:链表指针
*/
void Print_LinkList(LinkList* list){
	if(list == NULL){
		return;
	}
	//辅助指针
	LinkNode* pCurrent = list->head->next;
	while(pCurrent != NULL){
		printf("%d ", pCurrent->data);
		pCurrent = pCurrent->next;
	}
	printf("\n");
}

创建链表合并.c文件,测试功能

/*
*两个链表的合并
*HuangLiang 2022/03/19
*/
#include <stdio.h>
#include <stdlib.h>


#include "LinkListMerge.h"


int main() {
	
	//初始化链表list1,list2
	LinkList* list1 = Init_LinkList();
	LinkList* list2 = Init_LinkList();
	
	//初始化数据
	for(int i =0; i<5; i++){
		Insert_LinkList(list1, 0, i+1);
	}
	for(int i =5; i<10; i++){
		Insert_LinkList(list2, 0, i+1);
	}
	//打印数据
	Print_LinkList(list1);
	Print_LinkList(list2);
	
	//合并
	list1 = Merge_LinkList(list1, list2);
	Print_LinkList(list1);
	//合并后的链表排序
	Sort_LinkList(list1);
	//打印排序后的list1
	printf("After sort: ");
	Print_LinkList(list1);
	
	return 0;
}

题目:统计给定区间[a, b]内,每一个正整数的各位数字之和是否等于5,统计该区间内有多少个符号条件的数,并计算这些整数的和

输入:区间[a, b]

输出:给定区间[a, b]内有多少个满足题干要求的整数,并计算这些整数的和。

优化目标:无

#include <stdio.h>

/*
*判断一个数的每一位之和是否为5
*@number:待判断的数
*/
int is( int number ){
	int num = 0;
	while(number > 0){
		num += number % 10;
		number = number / 10;
	}
	if(num == 5){
		return 1;
	}else{
		return 0;
	}
}
/*
*统计给定区间,符合条件的数
*@a:区间下界
*@b:区间上界
*/
void count_sum( int a, int b ){
	int result = 0;
	int count = 0;
	for(int i=a; i<=b; i++){
		if(is(i)){
			result += i;
			count++;
		}
	}
	printf("count = %d, sum = %d", count, result);
}

int main()
{
    int a, b;

    scanf("%d %d", &a, &b);
    if (is(a)) printf("%d is counted.\n", a);
    if (is(b)) printf("%d is counted.\n", b);
    count_sum(a, b);

    return 0;
}

题目:输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入:输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符 串;第2行给出非负整数N。

输出:在一行中输出循环左移N次后的字符串。

优化目标:用单循环链表来完成

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1024

int main(){
    
    int N;
    char str[MAX_SIZE];
    gets(str);
    scanf("%d", &N);
    //如果移动次数大于字符串的长度,只需取余数即可。
    if(N>strlen(str)){
        N = N % strlen(str);
    }
    for(int i=N; i<strlen(str); i++){
        printf("%c", str[i]);
    }
    for(int i=0; i<N; i++){
        printf("%c", str[i]);
    }
    return 0;
}

题目:我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。

输入:输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。

输出:输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。

优化目标:无

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1024

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    char num[MAX_SIZE][11];
    char string[11];//数据交换时的中间变量
    for(int i=0; i<=n; i++){
        gets(num[i-1]);
    }
    //冒泡排序
    for(int i=0; i<m; i++){
        for(int j=1; j<n - i; j++){
            if(strcmp(num[j-1],num[j]) > 0){
            	strcpy(string, num[j-1]);
            	strcpy(num[j-1], num[j]);
            	strcpy(num[j], string);
                
            }
        }
    }
    //打印结果
     for(int i=0; i<n; i++){
        printf("%s\n", num[i]);
    }
    return 0;
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐