我试图理解将两个排序列表合并为一个排序输出。从互联网上获得以下代码,理想情况下,
trav
的值必须是 mergedHead 的地址,但在这里,trav
保存着mergedHead
的值,并且*mergedHead
的值等于*trav
的值价值。谁能告诉我为什么会发生这种情况?另外请解释一下为什么这里的 mergedHead 的地址是 0。
此页面没有帮助。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
}Node;
Node *createNode(int data) {
Node *newNode = (Node *) malloc(sizeof(Node));
if(!newNode) {
printf("mem-alloc failed for data: %d\n", data);
exit(EXIT_FAILURE);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
Node *mergeTwoSortedLists(Node *head1, Node *head2) {
Node *mergedList = NULL;
Node **trav = &mergedList;
if(!head1 && !head2) {
printf("Both the heads are NULL, cant merge\n");
return NULL;
}
while (head1 && head2) {
if(head1->data <= head2->data) {
*trav = createNode(head1->data);
printf("&trav: %p trav: %p, *trav: %p, **trav: %d, &mergedList: %p, mergedList: %p, *mergedList: %p\n", &trav, trav, *trav, **trav, &mergedList, mergedList, *mergedList);
head1 = head1->next;
}
else {
*trav = createNode(head2->data);
printf("&trav: %p trav: %p, *trav: %p, **trav: %d, &mergedList: %p, mergedList: %p, *mergedList: %p\n", &trav, trav, *trav, **trav, &mergedList, mergedList, *mergedList);
head2 = head2->next;
}
trav = &((*trav)->next);
}
/* insertion of the remaining list to the trav
or insert the list that is not null. */
while (head1) {
*trav = createNode(head1->data);
printf("&trav: %p trav: %p, *trav: %p, **trav: %d, &mergedList: %p, mergedList: %p, *mergedList: %p\n", &trav, trav, *trav, **trav, &mergedList, mergedList, *mergedList);
head1 = head1->next;
trav = &((*trav)->next);
}
while (head2) {
*trav = createNode(head2->data);
printf("&trav: %p trav: %p, *trav: %p, **trav: %d, &mergedList: %p, mergedList: %p, *mergedList: %p\n", &trav, trav, *trav, **trav, &mergedList, mergedList, *mergedList);
head2 = head2->next;
trav = &((*trav)->next);
}
return mergedList;
}
void createSortedList(Node **head, int data) {
Node *trav = NULL;
Node *newNode = (Node *) malloc(sizeof(Node));
if(!newNode) {
printf("Memalloc failed - No memory allocated for data: %d\n", data);
return;
}
newNode->data = data;
if(!(*head) || (*head)->data >= data) {
newNode->next = *head;
*head = newNode;
return;
}
trav = *head;
while((trav->next) && (trav->next->data < data)) {
trav = trav->next;
}
newNode->next = trav->next;
trav->next = newNode;
return;
}
void printList(Node *head) {
if(!head) {
printf("Node is empty\n");
return;
}
while(head) {
printf("%d\t", head->data);
head = head->next;
}
printf("\n");
return;
}
int main() {
Node *head = NULL;
Node *head2 = NULL;
Node *head3 = NULL;
createSortedList(&head, 3);
createSortedList(&head, 5);
createSortedList(&head, 7);
createSortedList(&head, 3);
createSortedList(&head, 4);
createSortedList(&head, 9);
printList(head);
createSortedList(&head2, 10);
createSortedList(&head2, 5);
createSortedList(&head2, 9);
createSortedList(&head2, 4);
printList(head2);
head3 = mergeTwoSortedLists(head, head2);
printList(head3);
return 0;
}
输出:
PS C:\Users\42410\Desktop\C\VSCode\LinkedList> .\a.exe
3 3 4 5 7 9
4 5 9 10
&trav: 0061FED8 trav: 0061FEDC, *trav: 007C0E28, **trav: 3, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E2C, *trav: 007C0E38, **trav: 3, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E3C, *trav: 007C0E48, **trav: 4, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E4C, *trav: 007C0E58, **trav: 4, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E5C, *trav: 007C0E68, **trav: 5, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E6C, *trav: 007C0E78, **trav: 5, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E7C, *trav: 007C0E88, **trav: 7, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0E8C, *trav: 007C04B0, **trav: 9, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C04B4, *trav: 007C0F20, **trav: 9, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
&trav: 0061FED8 trav: 007C0F24, *trav: 007C0EE0, **trav: 10, &mergedList: 00000000, mergedList: 0061FEDC, *mergedList: 007C0E28
3 3 4 4 5 5 7 9 9 10
PS C:\Users\42410\Desktop\C\VSCode\LinkedList>
您的打印声明是错误的。
如果您没有从编译器收到任何警告,则需要提高警告级别。例如,对于
gcc
使用选项:-Wall -Wextra -Werror -pedantic
打印指针(即
%p
),您需要将指针强制转换为空指针。喜欢:
int x;
int* p = &x;
printf("P equals %p\n", (void*)p);
^^^^^^^
cast to void*
更糟糕的是
**trav
属于 Node
类型,但您使用 %d
打印它。您可能想打印 (**trav).data
。
和
*mergedList
类似。再次是 Node
,但这次您使用 %p
打印它。也许您想要 %d
和 (*mergedList).data
。