7-31 字符串循环左移

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

输入格式

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

输出格式

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

输入样例

Hello World!
2

输出样例

llo World!He

分析与答案

用循环链表来储存输入的字符串(包括空格),每一个结点储存一个字母,并将结尾的next指针指向链表开头。这样,我们可以忽略字符串长度和移动次数的影响(scanf读不到换行符就不停往后加结点),也不需要真的循环左移字符串本身,而是用一个指针从开头向右移动到指定位置后开始输出,到达开始位置的前一个节点为止,这样也能忽略移动次数和字符串长度之间大小关系的影响(循环链表保证N​比字符串大也能自动回到开始位置继续移动)。

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

typedef struct list{
    struct list * prev;
    char letter;
    struct list * next;
}strList;

int main(){
    strList * input = (strList *)malloc(sizeof(strList));
    input->prev = NULL;
    input->letter = EOF;
    strList * start = input;
    char c;
    c = getchar();
    while(c!='\n'){
        if(input->prev == NULL&&input->letter==EOF){
            input->letter = c;
        }
        else{
            input->next = (strList *)malloc(sizeof(strList));
            input->next->prev = input;
            input = input->next;
            input->letter = c; 
        }
        c = getchar();
    }
    input->next = start;
    input = input->next;
    int n = 0,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        start = start->next;
    }
    input = start;
    do{
        printf("%c",input->letter);
        input = input->next;
    }
    while(input!=start);
    return 0;
}

7-31 测试点