C语言编程练习day20
题目:合并两个链表,有序输出合并后(升序)的链表输入: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 <
题目:合并两个链表,有序输出合并后(升序)的链表
输入: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;
}
更多推荐
所有评论(0)