7-31 字符串循环左移
输入一个字符串和一个非负整数
输入格式
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数
输出格式
在一行中输出循环左移
输入样例
Hello World!
2
输出样例
llo World!He
分析与答案
用循环链表来储存输入的字符串(包括空格),每一个结点储存一个字母,并将结尾的next
指针指向链表开头。这样,我们可以忽略字符串长度和移动次数的影响(scanf
读不到换行符就不停往后加结点),也不需要真的循环左移字符串本身,而是用一个指针从开头向右移动到指定位置后开始输出,到达开始位置的前一个节点为止,这样也能忽略移动次数和字符串长度之间大小关系的影响(循环链表保证
#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;
}