C中的反向链表程序

时间:2016-08-12 03:31:44

标签: c linked-list

我在C中有以下简单的链接列表程序,除反向数据外,它的工作正常。功能。我错过了什么? (第二反转功能也有类似的问题) enter image description here

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct LinkedListNodeType {
    int data;
    struct LinkedListNodeType *pLink;
} LinkedListNode;

typedef struct LinkedListType {
    int             currentCount;
    LinkedListNode  headerNode;
} LinkedList;

LinkedList *createLinkedList() {
    LinkedList *pReturn = (LinkedList *)malloc(sizeof(LinkedList));
    memset(pReturn, 0, sizeof(LinkedList));
    return pReturn;
}

int addLinkedListData(LinkedList *pList, int position, int data) {
    int i = 0;
    LinkedListNode *pNewNode = NULL;
    LinkedListNode *pPreNode = NULL;

    pNewNode = (LinkedListNode *)malloc(sizeof(LinkedListNode));
    pNewNode->data = data;

    pPreNode = &(pList->headerNode);
    for (i = 0; i < position; i++) {
        pPreNode = pPreNode->pLink;
    }

    pNewNode->pLink = pPreNode->pLink;
    pPreNode->pLink = pNewNode;
    pList->currentCount++;
    return 0;
}

void deleteLinkedList(LinkedList *pList) {
    LinkedListNode *pDelNode = NULL;
    LinkedListNode *pPreNode = pList->headerNode.pLink;
    while (pPreNode != NULL) {
        pDelNode = pPreNode;
        pPreNode = pPreNode->pLink;

        free(pDelNode);
    }

    free(pList);
}

void iterateLinkedList(LinkedList *pList)
{
    int count = 0;
    LinkedListNode *pNode = NULL;

    pNode = pList->headerNode.pLink;
    while (pNode != NULL) {
        printf("[%d],%d\n", count, pNode->data);
        count++;

        pNode = pNode->pLink;
    }
    printf("node count: %d\n", count);
}

void reverseLinkedList(LinkedList *pList) {
    LinkedListNode *preNode = NULL;
    LinkedListNode *PpreNode = NULL;
    LinkedListNode *headNode = pList->headerNode.pLink;

    while (headNode->pLink != NULL) {
        if (preNode = NULL) {
            preNode = headNode;
            headNode = headNode->pLink;
            preNode->pLink = NULL;
        } else {
            PpreNode = headNode;
            headNode = headNode->pLink;
            PpreNode->pLink = preNode;
            preNode = PpreNode;
        }
    }
    headNode->pLink = PpreNode;
}

//void reverseLinkedList(LinkedList *pList) {       
//  LinkedListNode *preNode = NULL;
//  LinkedListNode *PpreNode = NULL;
//  LinkedListNode **headNode = &(pList->headerNode.pLink); 
//
//  while ((*headNode)->pLink != NULL) {
//      if (preNode = NULL) {
//          preNode = (*headNode);
//          (*headNode) = (*headNode)->pLink;
//          preNode->pLink = NULL;
//      } else {
//          PpreNode = (*headNode);
//          (*headNode) = (*headNode)->pLink;
//          PpreNode->pLink = preNode;
//          preNode = PpreNode;
//      }
//  }
//  (*headNode)->pLink = PpreNode;
//}

int main(int argc, char* argv[])
{
    LinkedList *pList = NULL;
    pList = createLinkedList();
    addLinkedListData(pList, 0, 70);
    addLinkedListData(pList, 0, 60);
    addLinkedListData(pList, 0, 50);
    addLinkedListData(pList, 0, 40);
    addLinkedListData(pList, 0, 30);
    addLinkedListData(pList, 0, 20);
    addLinkedListData(pList, 0, 10);

    printf("revers before\n");
    iterateLinkedList(pList);

    printf("\n\nrevers\n");
    reverseLinkedList(pList);
    iterateLinkedList(pList);

    deleteLinkedList(pList);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

void reverseLinkedList(LinkedList* pList) {
    LinkedListNode* preNode = NULL;
    LinkedListNode* PpreNode = NULL;
    LinkedListNode* headNode = pList->headerNode.pLink;
    while (headNode != NULL) {
        PpreNode = headNode->pLink;
        headNode->pLink = preNode;
        preNode = headNode;
        headNode = PpreNode;
    }
    pList->headerNode.pLink = preNode;
}