按字母顺序插入双链表问题

时间:2016-01-25 05:53:28

标签: c linked-list alphabetical-sort

所以,我正在从一个文件中读取并将国家公园名称插入到双链表中的节点中。现在,我想按字母顺序插入,我认为我在插入函数中这样做,但是当我打印出列表时,它只是按插入顺序排列。我的猜测是我有一个插入函数中strcmp出错,但我无法弄明白。

我想使用sentinel节点。因此,第一个节点中包含"",最后一个节点在数据字段中具有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

主要

 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;
}

2 个答案:

答案 0 :(得分:0)

您正在将文件读取行存储到parkName,但比较基于data字段

答案 1 :(得分:0)

首先,您应该创建一个等于NULL的空链表,然后在搜索之前的insert函数中,您可以控制列表是否为空(为了不在第一次插入时将字符串与NULL进行比较)。

另一个问题是插入函数的这一部分:

            while (strcmp(data,curr->data) > 0)
            {
                prev = curr;
                curr = curr->forw;
            }

您只控制数据是否按字母顺序排列在当前数据之后,我的意思是您只控制前进,如果您插入的数据以" D"开头。在以" R"开头的数据之后例如,您的代码不会处理它。所以你也应该考虑反向控制。

另一个问题是上面提到的pouyan,你将数据放入数据而不是parkname。