按字母顺序排序插入双向链表

时间:2016-04-30 00:21:33

标签: c doubly-linked-list

我目前正在尝试创建一个双向链表,按字母顺序对插入的char值进行排序,但由于用于比较数据值的循环,它没有正确更新以前的节点。

这是我目前的插入代码:

void insert(ListNodePtr *sPtr, char value)
{
    ListNodePtr newPtr; /* pointer to new node */
    ListNodePtr previousPtr; /* pointer to previous node in list */
    ListNodePtr currentPtr; /* pointer to current node in list */

    newPtr = (ListNode*)malloc(sizeof(ListNode)); /* create node */

    if (newPtr != NULL) { /* is space available */
        newPtr->data = value; /* place value in node */
        newPtr->nextPtr = NULL; /* node does not link to another node */
        newPtr->prevPtr = NULL;

        previousPtr = NULL;
        currentPtr = *sPtr;

        /* loop to find the correct location in the list */
        while (currentPtr != NULL && value > currentPtr->data) {
            previousPtr = currentPtr; /* walk to ...   */
            currentPtr = currentPtr->nextPtr; /* ... next node */
        } /* end while */

          /* insert new node at beginning of list */
        if (previousPtr == NULL) {
            newPtr->nextPtr = *sPtr;
            *sPtr = newPtr;
        } /* end if */
        else { /* insert new node between previousPtr and currentPtr */
            previousPtr->nextPtr = newPtr;
            newPtr->prevPtr = previousPtr;
            newPtr->nextPtr = currentPtr;
        } /* end else */
    } /* end if */
    else {
        printf("%c not inserted. No memory available.\n", value);
    } /* end else */
} /* end function insert */

这是我的节点结构:

/* self-referential structure */
struct listNode {
    char data; /* each listNode contains a character */
    struct listNode *nextPtr; /* pointer to next node*/
    struct listNode *prevPtr; /* pointer to previous node*/
}; /* end structure listNode */

typedef struct listNode ListNode; /* synonym for struct listNode */
typedef ListNode *ListNodePtr; /* synonym for ListNode* */

这是我的打印功能:

void printReverse(ListNodePtr currentPtr)
{
    /* if list is empty */
    if (currentPtr == NULL) {
        printf("List is empty.\n\n");
    } /* end if */
    else {
        printf("The list in reverse is:\n");

        while (currentPtr->nextPtr != NULL)
            currentPtr = currentPtr->nextPtr;

        /* while not the beginning of the list */
        while (currentPtr != NULL) {
            printf("%c --> ", currentPtr->data);
            currentPtr = currentPtr->prevPtr;
        } /* end while */

        printf("NULL\n\n");
    } /* end else */
} /* end function printList */

这是我得到的输出:

output when entering chars in ascending order of ASCII value它正常运作

but when I add a larger value and then a value smaller than that one它不会打印正确的先前值。

过去几天我一直在努力想弄清楚要做什么,但我找不到其他人所处的任何相关情况,所以我很感激我能得到的任何帮助。谢谢!

P.S。这是一个新的任务,我通常不会向它寻求帮助,但书中没有说明双向链接列表,更不用说如何按字母顺序插入数据,所以我现在真的非常渴望得到帮助我很乐意接受任何可以让我指出正确方向的信息!

1 个答案:

答案 0 :(得分:0)

你忘了指定一个指针。由于这是一个硬件分配,我只是给你一个提示。考虑插入的所有情况。在previousPtr函数中的currentPtr循环后,您应该计算四种情况,具体取决于NULLwhileinsert

  1. previousPtrcurrentPtr都是NULL。 (空列表)
  2. previousPtrNULL。 (你在列表前面)
  3. currentPtrNULL。 (您将附加到列表中)
  4. previousPtrcurrentPtr都不是NULL。 (在两个现有节点之间插入)
  5. 您的代码正确处理案例1-3,但在案例4中失败,因为您尚未分配需要分配的所有指针。对于双向链表,需要为案例4指定四个指针:previousPtr->nextnewNode->prevPtrnewNode->nextPtr和????。