链表排序只接受c语言中文件的最后一行



这个函数应该在每次运行j的for循环时打印文件的链表。用户输入一个他们希望排序的数字,例如,如果他们输入"3",程序将按列表中的第三个元素排序。然而,它给出了不正确的输出。

typedef struct Node
{
    char **data;    
    struct Node *next;
}Node;
Node *head = ( Node* )malloc( sizeof( Node ) );
head = NULL; //empty list
void categoryStore( FILE* fpi, int numCols, int numRows, Node *head )
{
    void addStart(Node**, char**, int );
    void insertionSort( Node**, char**, int, int );
    void printLinkedList( Node*, int );
    int i = 0, j = 0, ret = 0, userinput;
    char *firstLine, *dump, **catstore;
    dump = ( char* )malloc( 50*sizeof( char ) );
    firstLine = ( char* )malloc( 50*sizeof( char ) );
    catstore = ( char** )malloc( 50*numCols*sizeof( char* ) );
    do
    {
        scanf( "%d", &userinput ); /* let the user select the catagory via a number */
        if( userinput >= 0 && userinput < numCols)
        {
            fscanf( fpi,"%s%*[^n]n", firstLine );
            for( j = 0; j < numRows; j++ )
            {
                for(i = 0; i <= numCols - 1; i++)
                {
                    catstore[i] = ( char* )malloc( 50*sizeof( char ) );
                    if( i < numCols - 1 )
                    {
                        fscanf( fpi, "%[^,],", catstore[i] );
                    }
                    else
                    {
                        fscanf( fpi, "%[^n]n", catstore[i] );
                    }

                }
                if( j == 0 )
                {
                    addStart( &head, catstore, numCols );
                    printLinkedList( head, numCols );
                }
                else
                {
                    insertionSort( &head, catstore, userinput, numCols );
                    printLinkedList( head, numCols );
                }
            }
        }
        else if( userinput == numCols )
        {
            printf( "goodbyen" );
        }
        else
        {
            printf( "Invalid input, please try againn" );
            ret = -1;
        }
    }while( ret != 0 );
}  

  /* function to add a node to the start of the linkedlist */
void addStart( Node** head, char **line, int numCols )
{
    int i;
    Node *temp = ( Node* )malloc( sizeof( Node ) ); //create and temporarily store the address of temp
    temp->data = ( char** )malloc( 50*numCols*sizeof( char* ) );
    temp->data = line;
    for( i = 0; i < numCols; i++ )
    {
        strcpy( temp->data[i], line[i] );
    }

    temp->next = *head; //dereferences temp and points the element "next" to what head is pointing to

    *head = temp; //now head points to temp
}

/* function to insert addition lines and sort them */
void insertionSort(Node **head, char **line, int select, int numCols)
{
    int i;
    Node *temp = ( Node* )malloc( sizeof( Node ) );
    temp->data = ( char** )malloc( 50*numCols*sizeof( char* ) );
    temp->data = line;
    for( i = 0; i < numCols; i++ )
    {
        strcpy( temp->data[i], line[i] );
    }
    Node *temp1, *temp2;
    temp1 = *head;
    temp2 = *head;
    temp1 = temp1->next;

    if( strcmp( temp2->data[select], temp->data[select] ) >= 0 )
    {
        temp->next = temp2;
        *head = temp;
    }
    else
    {
        if(temp1->next != NULL)
        {
            while( strcmp( temp1->data[select], temp->data[select] ) < 0 && temp1->next != NULL )
            {
                temp1 = temp1->next;
                temp2 = temp2->next;
            }
            if ( temp1->next == NULL && strcmp( temp1->data[select], temp->data[select] ) < 0 )
            {
                temp->next = NULL;
                temp1->next = temp;
            }
            else
            {
                temp2->next = temp;
                temp->next = temp1;
            }
        }
        else
        {
            if( strcmp( temp1->data[select], temp->data[select] ) < 0 )
            {
                temp->next = NULL;
                temp1->next = temp;
            }
            else
            {   
                temp2->next = temp;
                temp->next = temp1;
            }
        }   
    }
}

/* print the linked list */  
void printLinkedList( Node* head, int numCols )
{
    while( head != NULL )
    {
        int i=0;
        for (i = 0; i < numCols; i++)
        {
            printf( "%s", head->data[i] );
        }
        printf( "n" );
        head = head->next;
    }   
}

输入文件包含:

姓名(字符串)、年龄(整数)、地址(字符串)、食物(字符串)、颜色(字符串)
马克,21岁,在家,奶酪,黄色
乔丹,19岁,他的家,纸杯蛋糕,深蓝色
约翰,40岁,珠穆朗玛峰,沙拉,红色
杰洛特,100岁,凯尔·莫罕,狼,白色
山姆,50岁,土豆和草莓,绿色

如果输入是3

输出应该是:

标记21在家奶酪黄色

标记21在家奶酪黄色
乔丹19他的地方纸杯蛋糕深蓝色

标记21在家奶酪黄色
乔丹19他的地方纸杯蛋糕深蓝色
约翰40珠穆朗玛峰沙拉红

标记21在家奶酪黄色
乔丹19他的地方纸杯蛋糕深蓝色
杰洛特100凯尔莫罕沃尔夫白
约翰40珠穆朗玛峰沙拉红

标记21在家奶酪黄色
乔丹19他的地方纸杯蛋糕深蓝色
杰洛特100凯尔莫罕沃尔夫白
约翰40珠穆朗玛峰沙拉红色
萨姆50土豆和草莓绿色

当前输出为:

标记21在家奶酪黄色
乔丹19他的地方纸杯蛋糕深蓝色
乔丹19他的地方纸杯蛋糕深蓝色
约翰40珠穆朗玛峰沙拉红色
约翰40珠穆朗玛峰沙拉红色
约翰40珠穆朗玛峰沙拉红色
杰洛特100凯尔莫罕沃尔夫白
杰洛特100凯尔莫罕沃尔夫白
杰洛特100凯尔莫罕沃尔夫白
杰洛特100凯尔莫罕沃尔夫白
萨姆50土豆和草莓绿色
萨姆50土豆和草莓绿色
萨姆50土豆和草莓绿色
萨姆50土豆和草莓绿色
萨姆50土豆和草莓绿色

看起来好像每次调用函数时都会读取最后一行,并且正在替换当前在链表中的每一行。有人能告诉我为什么会这样吗?任何帮助将非常感激!谢谢。

问题是catstore的指针数组只分配一次,因此每一个新行都会覆盖前任何行中的所有字段指针。您需要移动分配指针数组的行,它只需要分配numCols指针。

            for( j = 0; j < numRows; j++ )
            {
                /* moved this line, deleted the "50 *"  */
                catstore = ( char** )malloc( numCols*sizeof( char* ) );
                for(i = 0; i <= numCols - 1; i++)
                {

insertionSort()需要修复/清理。如果你修复insertionSort(),使其处理空列表,你可以摆脱addStart()。

    /* delete this line */
    temp->data = ( char** )malloc( 50*numCols*sizeof( char* ) );
    /* this line is ok */ 
    temp->data = line;

相关内容

  • 没有找到相关文章

最新更新