2016-08-12 60 views
0

我在C中有下面这个简单的链表列表程序,它很好地适用于反向的'数据'功能。我在想什么? (第二反向函数具有类似的问题,太) enter image description hereC中的反向链表程序

#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; 
} 
+0

TL; DR 1)'如果(preNode = NULL)' - >'如果(preNode == NULL)'2)' headNode-> pLink = PpreNode;' - >'headNode-> pLink = PpreNode; pList-> headerNode.pLink = headNode;' – BLUEPIXY

回答

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