我在C中有以下简单的链接列表程序,除反向数据外,它的工作正常。功能。我错过了什么?
(第二反转功能也有类似的问题)
#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 :(得分: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;
}