如何解决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\n");
}
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:\n");
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;
}
解决方法
对于初学者来说,这个 typedef 声明中别名的名称 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;
};
并在主列表中定义
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( '\n',display( &numbers,stdout ) );
rotate( &numbers,1 );
fputc( '\n',2 );
fputc( '\n',3 );
fputc( '\n',4 );
fputc( '\n',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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。