gpt4 book ai didi

c - C 链表中的冒泡排序

转载 作者:行者123 更新时间:2023-11-30 20:10:02 25 4
gpt4 key购买 nike

我需要做的是将输入文件读入链接列表。该文件的部分内容是:

姓名 A,25 岁​​
姓名B,33
NameC,23
姓名D,39

之后我需要按数字排序(冒泡排序)并将其写入另一个文件。

这是我所拥有的:

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

struct node{
char name[20];
int number;
struct node *next;
struct node *prev;
}*head;

int main(void) {

struct node *temp;
temp = malloc(sizeof(struct node));
temp->next = NULL;
head = temp;

FILE *ifp;
char fnamer[100] = "";
char line[128];
// printf("\n\nPlease Enter the Full Path of the file: \n");
// scanf("%s",&fnamer);

ifp = fopen("mintaadatok.txt", "r");
if (ifp == NULL) {
printf("\n%s\" File NOT FOUND!", fnamer);
exit(1);
}

int c = 0;

char buffer[1024];
memset(buffer, 0, 1024);
while (c < 15) {
fgets(buffer, 1024, ifp);
sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
printf("%d %s %d\n", c, temp->name, temp->number);
temp->next = malloc(sizeof(struct node));
temp = temp->next;
temp->next = NULL;
c++;
}

int i,step;
for (temp = head; temp; temp = temp->next) {
printf("%s", temp->name);
printf("%d\n", temp->number);
for(step=0;step<10-1;++step)
for(i=0;i<10-step-1;++i)
{
temp->next = malloc(sizeof(struct node));
if(temp->number>temp->next)
{
temp=temp->number;
temp->number=temp->next;
temp->next=temp;
}
}
}
printf("In ascending order: ");
}

你能帮我对这些数据进行排序吗?

最佳答案

我们初学者应该互相帮助。:)

我没有查看你所有的代码。然而,它显然是不正确的,例如由于该循环中节点分配的顺序不正确

while (c < 15) {
fgets(buffer, 1024, ifp);
sscanf(buffer, "%19[^,], %d", temp->name, &temp->number);
printf("%d %s %d\n", c, temp->name, temp->number);
temp->next = malloc(sizeof(struct node));
temp = temp->next;
temp->next = NULL;
c++;
}

因此,除了数据成员 next 之外,最后一个节点将具有具有不确定值的数据成员。

我正在尝试回答您的问题如何为单链表编写冒泡排序函数

对于像你我这样的初学者来说,为单链表编写冒泡排序函数并不是一件容易的事。例如,您需要为列表的节点正确编写交换函数。

给你。

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

struct node
{
char name[20];
int id;
struct node *next;
};

int push_back( struct node **head, const char *name, int id )
{
struct node *tmp = malloc( sizeof( struct node ) );
int success = tmp != NULL;

if ( success )
{
while ( *head != NULL ) head = &( *head )->next;

strcpy( tmp->name, name );
tmp->id = id;
tmp->next = NULL;

*head = tmp;
}

return success;
}

void display( struct node **head )
{
for ( struct node *current = *head; current != NULL; current = current->next )
{
printf( "{ %s, %d } ", current->name, current->id );
}
}

void swap( struct node **current )
{
struct node *tmp = ( *current )->next->next;
( *current )->next->next = *current;
*current = ( *current )->next;
( *current )->next->next = tmp;
}


void bubble_sort( struct node **head, int cmp( const void *, const void * ) )
{
if ( *head != NULL )
{
for ( struct node *last = NULL, *swapped = NULL; ( *head )->next != last; last = swapped )
{
swapped = ( *head )->next;

for ( struct node **first = head; ( *first )->next != last; first = &( *first )->next )
{
if ( cmp( ( *first )->next, *first ) < 0 )
{
swap( first );
swapped = ( *first )->next;
}
}
}
}
}

int cmp_id( const void *a, const void *b )
{
const struct node *left = a;
const struct node *right = b;

return ( right->id < left->id ) - ( left->id < right->id );
}

int cmp_name( const void *a, const void *b )
{
const struct node *left = a;
const struct node *right = b;

return strcmp( left->name, right->name );
}

int main(void)
{
struct node *head = NULL;

push_back( &head, "NameA", 25 );
push_back( &head, "NameB", 33 );
push_back( &head, "NameC", 23 );
push_back( &head, "NameD", 39 );

display( &head );
putchar( '\n' );

bubble_sort( &head, cmp_id );

display( &head );
putchar( '\n' );

bubble_sort( &head, cmp_name );

display( &head );
putchar( '\n' );

return 0;
}

程序输出为

{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 } 
{ NameC, 23 } { NameA, 25 } { NameB, 33 } { NameD, 39 }
{ NameA, 25 } { NameB, 33 } { NameC, 23 } { NameD, 39 }

在演示程序中,列表首先按 ID 排序,然后按名称排序。

因此,您现在需要的就是根据所用文件中的数据正确构建列表。

关于c - C 链表中的冒泡排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47639448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com