C语言中指向空指针的二级指针工作原理及合并有序链表代码疑问
C语言中指向空指针的二级指针工作原理及合并有序链表代码疑问
我现在在理解如何把两个有序链表合并成一个有序链表的逻辑,从网上找到了这段代码,但我有点搞不懂*trav和mergedList之间的关系。我原本以为trav应该保存mergedList的地址,但现在看起来trav存的是mergedList的值,而且*mergedList和*trav的值是等价的,有没有人能帮我解释下这是怎么回事?之前查过相关资料,但没找到有用的内容。
#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>
备注:内容来源于stack exchange,提问作者Preethi
相关产品推荐
相关产品推荐

