如何将第一个符号移到最后?

时间:2014-03-18 17:08:04

标签: c linked-list

我需要使用列表将第一个符号移到最后。它应该移动到最后并从开始删除。我是一个初学者,所以对我来说很难。感谢帮助。这是我的代码,我不知道我还能做什么...

#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;
}

1 个答案:

答案 0 :(得分:2)

不是将第一个符号复制到最后,而是可以更新指针,使列表的末尾现在指向第一个元素。我们可以分三步完成:

  1. 查找列表的末尾

  2. 将第一个元素放在最后

  3. 将列表的头部指向新的头部。


  4. 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;