C根据用户选择旋转链接列表 [英] C rotate linked list by user choice

查看:0
本文介绍了C根据用户选择旋转链接列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个程序,它从用户编号到链表和编号,以确定每个节点向左旋转多少。我只是成功地做到了这一点,但不是在一个圈子里。并且我的程序需要能够将节点向左移动,而不是圆圈中列表的长度。 有人知道我怎样才能修复我的程序吗?(需要修复的函数是";RotateALinkedList";函数)。我的意思是,如果用户想要将列表向左移动4次,第一个节点将从最后一个节点开始。

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


typedef struct numbers_list
{
    int data;
    struct numbers_list* next;
}number;

void RotateALinkedList(number** head, int node); //the function that rotate the linked list
int CreateLinkedList(number** head, int iNumberofNode);
int attachToEnd(number** head, int k);
void PrintTheList(number* pNode);
void FreeAllocatedMemory(number** head);

int main(void)
{
    int list_len = 0;
    int data = 0;
    number* head = NULL;
    printf("How many nodes in list? ");
    scanf("%d", &list_len);
    getchar();
    CreateLinkedList(&head, list_len);
    printf("Choose a number k, and the list will be rotated k places to the left: ");
    scanf("%d", &data);
    getchar();
    if (data <= list_len)
    {
        RotateALinkedList(&head, data);
        PrintTheList(head);
    }
    else
    {
        printf("Please Enter Valid number of node
");
    }
    FreeAllocatedMemory(&head);
    getchar();
    return 0;
}

void RotateALinkedList(number** head, int node)
{
    int count = 0;
    number* p = *head;
    number* tempNode = NULL;
    for (count = 1; ((count < node) && (p != NULL)); count++)
    {
        p = p->next;
    }
    if (p == NULL)
    {
        return;
    }
    else
    {
        tempNode = p;
    }
    while (p->next != NULL)
    {
        p = p->next;
    }
    p->next = *head;
    *head = tempNode->next;
    tempNode->next = NULL;
}

int CreateLinkedList(number** head, int iNumberofNode)
{
    int data = 0;
    int iRetValue = -1;
    int count = 0;
    number* pNewNode = NULL;
    for (count = 0; count < iNumberofNode; count++)
    {
        printf("Enter number: ");
        scanf("%d", &data);
        getchar();
        if ((*head) == NULL)
        {
            pNewNode = (number*)malloc(sizeof(number));
            if (pNewNode != NULL)
            {
                pNewNode->data = data;
                pNewNode->next = NULL;
                *head = pNewNode;
                iRetValue = 0;
            }
        }
        else
        {
            iRetValue = attachToEnd(head, data);
        }
    }
    return iRetValue;
}

int attachToEnd(number** head, int k)
{
    int iRetValue = -1;
    number* pLastNode = NULL;
    number* pNewNode = NULL;
    pLastNode = *head;
    pNewNode = (number*)malloc(sizeof(number));
    if (pNewNode != NULL)
    {
        pNewNode->data = k;
        pNewNode->next = NULL;
        iRetValue = 0;
    }
    if (pLastNode == NULL)
    {
        *head = pNewNode;
    }
    else
    {
        while (pLastNode->next != NULL)
        {
            pLastNode = pLastNode->next;
        }
        pLastNode->next = pNewNode;
    }
    return iRetValue;
}

void PrintTheList(number* pNode)
{
    printf("the rotated list:
");
    while (pNode != NULL)
    {
        printf("%d  ", pNode->data);
        pNode = pNode->next;
    }
}

void FreeAllocatedMemory(number** head)
{
    number* ptempNode = NULL;
    number* pFirstNode = NULL;
    pFirstNode = *head;
    while (pFirstNode != NULL)
    {
        ptempNode = pFirstNode;
        pFirstNode = pFirstNode->next;
        free(ptempNode);
    }
    *head = NULL;
}

推荐答案

对于启动器来说,此tyecif声明中的别名number

typedef struct numbers_list
{
    int data;
    struct numbers_list* next;
}number;

令人困惑。

最好是定义两个结构

struct Node
{
    int data;
    struct Node *next;
};

struct List
{
    size_t size;
    struct Node *head;
};

并在Main中定义一个类似

的列表
struct List numbers = { .size = 0, .head = NULL };

如果列表包含指定列表中节点数的数据成员,则可以简化任务。

函数CreateLinkedList应该执行一项任务:从用户指定的数组创建列表。它应要求用户输入将存储在列表中的数字。

我可以建议以下演示程序中显示的解决方案。

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

struct Node
{
    int data;
    struct Node *next;
};

struct List
{
    size_t size;
    struct Node *head;
};

void clear( struct List *list )
{
    while ( list->head )
    {
        struct Node *tmp = list->head;
        list->head = list->head->next;
        free( tmp );
    }
    
    list->size = 0;
}

size_t create( struct List *list, const int a[], size_t n )
{
    clear( list );
    
    for ( struct Node **current = &list->head; 
          n-- && ( *current = malloc( sizeof( struct Node ) ) ) != NULL; )
    {
        ( *current )->data = *a++;
        ( *current )->next = NULL;
        current = &( *current )->next;
        ++list->size;
    }
    
    return list->size;
}

FILE * display( const struct List *list, FILE *fp )
{
    fprintf( fp, "There is/are %zu items: ", list->size );
    for ( struct Node *current = list->head; current != NULL; current = current->next )
    {
        fprintf( fp, "%d -> ", current->data );
    }
    
    fputs( "null", fp );
    
    return fp;
}

void rotate( struct List *list, size_t n )
{
    if ( ( list->size != 0 ) &&  ( ( n %= list->size ) != 0 ) )
    {
        struct Node **current = &list->head;
        
        while ( n-- ) current = &( *current )->next;
        
        struct Node *tmp = list->head;
        
        list->head = *current;
        *current = NULL;
        
        struct Node *last = list->head;
        while ( last->next != NULL ) last = last->next;
        last->next = tmp;
    }
}

int main(void) 
{
    struct List numbers = { .size = 0, .head = NULL };
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
    create( &numbers, a, sizeof( a ) / sizeof( *a ) );
    
    fputc( '
', display( &numbers, stdout ) );
    
    rotate( &numbers, 1 );
    
    fputc( '
', display( &numbers, stdout ) );
    
    rotate( &numbers, 2 );
    
    fputc( '
', display( &numbers, stdout ) );
    
    rotate( &numbers, 3 );
    
    fputc( '
', display( &numbers, stdout ) );
    
    rotate( &numbers, 4 );
    
    fputc( '
', display( &numbers, stdout ) );
    
    clear( &numbers );
    
    return 0;
}

程序输出为

There is/are 10 items: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null
There is/are 10 items: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 0 -> null
There is/are 10 items: 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 0 -> 1 -> 2 -> null
There is/are 10 items: 6 -> 7 -> 8 -> 9 -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> null
There is/are 10 items: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null

这篇关于C根据用户选择旋转链接列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆