C 按字母顺序插入双链接列表问题
所以,我从一个文件中读取并将国家公园的名称插入到一个双链接列表中的节点中。现在,我想按字母顺序插入,我想我是在插入函数中这样做的,但是当我要打印列表时,它只是按照它们插入的顺序。我猜我在insert函数中的strcmpC 按字母顺序插入双链接列表问题,c,linked-list,alphabetical-sort,C,Linked List,Alphabetical Sort,所以,我从一个文件中读取并将国家公园的名称插入到一个双链接列表中的节点中。现在,我想按字母顺序插入,我想我是在插入函数中这样做的,但是当我要打印列表时,它只是按照它们插入的顺序。我猜我在insert函数中的strcmpstrcmp中有一个错误,但我无法找出它 我想使用哨兵节点。因此,第一个节点中有”,最后一个节点的数据字段中有177。这是我第一次使用sentinel节点,我的老师希望我们使用它们,所以如果它们有错误,我道歉 谢谢你的帮助 #define DUMMY_TRAILER '\177'
strcmp
中有一个错误,但我无法找出它
我想使用哨兵节点。因此,第一个节点中有”
,最后一个节点的数据字段中有177
。这是我第一次使用sentinel节点,我的老师希望我们使用它们,所以如果它们有错误,我道歉
谢谢你的帮助
#define DUMMY_TRAILER '\177'
typedef struct node NODE;
struct node
{
char data[20]; //for sentinel nodes
char parkName[20];
NODE *forw;
NODE *back;
};
FILE *Open(void); // Opens file
NODE *init_list(void); //Creates the sentinel nodes
void insert(NODE *list, char *name); //Inserts nodes into list
void traverse_forw(NODE *list); // Traverse the list and prints
Main
int _tmain(int argc, _TCHAR* argv[])
{
FILE* inputFile;
NODE *list;
char tempName[31];
inputFile = Open();
list = init_list();
while(fgets(tempName, 31, inputFile) != NULL)
{
insert(list, tempName);
FLUSH;
}
traverse_forw(list);
free(list);
return 0;
}
void insert(NODE *list, char *data)
{
NODE *curr = list->forw;
NODE *prev = list;
NODE *pnew;
int duplicate = 1;
// search
while (strcmp(data,curr->data) > 0)
{
prev = curr;
curr = curr->forw;
}
if (strcmp(data, curr->data))
{
duplicate = 0; // not a duplicate
pnew = (NODE *) malloc(sizeof (NODE));
if (!pnew)
{
printf("Fatal memory allocation error in insert!\n");
exit(3);
}
strcpy(pnew->parkName, data);
pnew->forw = curr;
pnew->back = prev;
prev->forw = pnew;
curr->back = pnew;
}
return;
}
插入功能
int _tmain(int argc, _TCHAR* argv[])
{
FILE* inputFile;
NODE *list;
char tempName[31];
inputFile = Open();
list = init_list();
while(fgets(tempName, 31, inputFile) != NULL)
{
insert(list, tempName);
FLUSH;
}
traverse_forw(list);
free(list);
return 0;
}
void insert(NODE *list, char *data)
{
NODE *curr = list->forw;
NODE *prev = list;
NODE *pnew;
int duplicate = 1;
// search
while (strcmp(data,curr->data) > 0)
{
prev = curr;
curr = curr->forw;
}
if (strcmp(data, curr->data))
{
duplicate = 0; // not a duplicate
pnew = (NODE *) malloc(sizeof (NODE));
if (!pnew)
{
printf("Fatal memory allocation error in insert!\n");
exit(3);
}
strcpy(pnew->parkName, data);
pnew->forw = curr;
pnew->back = prev;
prev->forw = pnew;
curr->back = pnew;
}
return;
}
遍历以打印公园名称
void traverse_forw(NODE *list)
{
putchar('\n');
list = list->forw; // skip the dummy node
while (list->data[0] != DUMMY_TRAILER)
{
printf("%s\n", list->parkName);
list = list->forw;
}
return;
}
您正在将文件读取行存储到
parkName
中,但比较是基于数据
字段首先,您应该创建一个等于NULL的空链接列表,然后在搜索前的插入功能中,控制列表是否为空(为了避免在第一次插入时将字符串与NULL进行比较)
另一个问题是,在插入函数的这一部分中:
while (strcmp(data,curr->data) > 0)
{
prev = curr;
curr = curr->forw;
}
你只控制数据在当前数据之后是字母顺序的,我的意思是你只控制前向,如果你插入一个从“D”开始的数据,例如从“R”开始的数据,你的代码将不能处理它,所以你也应该考虑反向控制。 另一个问题是上面pouyan提到的,您将数据放入数据中,而不是公园名称中