这个函数应该在每次运行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;