我需要使用列表将第一个符号移到最后。它应该移动到最后并从开始删除。我是一个初学者,所以对我来说很难。感谢帮助。这是我的代码,我不知道我还能做什么...
#include <stdio.h>
#include <stdlib.h>
struct L
{
int symbol;
struct L *next;
};
typedef struct L List;
typedef List *ListPtr;
int main ()
{
int nr=0,i;
char a;
ListPtr lst ;
lst=(ListPtr) malloc(sizeof(List));
ListPtr start=lst;
printf("Enter list symbols (ctrl+z the end:\n");
scanf("%c",&(lst->symbol));
a=lst->symbol;
while (!feof(stdin))
{
lst->next=(ListPtr) malloc(sizeof(List));
lst=lst->next;
scanf("%c",&(lst->symbol));
nr++;
}
lst->next=(ListPtr) malloc(sizeof(List));
lst=lst->next;
lst->symbol=a;
lst->next=NULL;
lst=start;
printf("The list is:\n");
for (i=0; i<=nr; i++)
{
printf("%c",lst->symbol);
lst=lst->next;
}
printf("\n");
lst=start;
system("pause");
return 0;
}
答案 0 :(得分:2)
不是将第一个符号复制到最后,而是可以更新指针,使列表的末尾现在指向第一个元素。我们可以分三步完成:
查找列表的末尾
将第一个元素放在最后
将列表的头部指向新的头部。
ListPtr cur = lst;
if( !cur ) { // empty list }
while( cur->next ){ cur = cur->next; }
// 1. finished, end of list is cur
cur->next = lst;
// 2. finished, end of list is new element,
// but it is now a circular list as the last element still points to the first element
ListPtr new_head = lst->next;
lst->next = NULL;
lst = new_head;