[英]C Programming linked list pointer returning weird value
我在嘗試將兩個已排序的鏈表合並為一個時遇到了一些問題。 這是我的代碼:
void sortedMerge(LinkedList *l1, LinkedList *l2, LinkedList *result)
{
int i = 0;
while (l1->size > 0 && l2->size > 0) {
if (l1->head < l2->head) {
removeNode(l1, 0);
insertNode(result, i++, l1->head);
}
else {
removeNode(l2, 0);
insertNode(result, i++, l2->head);
}
}
}
int insertNode(LinkedList *ll, int index, int value)
{
ListNode *pre, *cur;
if (ll == NULL || index < 0 || index > ll->size + 1)
return -1;
if (ll->head == NULL || index == 0) {
cur = ll->head;
ll->head = malloc(sizeof(ListNode));
ll->head->item = value;
ll->head->next = cur;
ll->size++;
return 0;
}
if ((pre = findNode(ll, index - 1)) != NULL) {
cur = pre->next;
pre->next = malloc(sizeof(ListNode));
pre->next->item = value;
pre->next->next = cur;
ll->size++;
return 0;
}
return -1;
}
int removeNode(LinkedList *ll, int index)
{
ListNode *pre, *cur;
if (ll == NULL || index < 0 || index >= ll->size)
return -1;
if (index == 0) {
cur = ll->head->next;
free(ll->head);
ll->head = cur;
ll->size--;
return 0;
}
if ((pre = findNode(ll, index - 1)) != NULL) {
if (pre->next == NULL)
return -1;
cur = pre->next;
pre->next = cur->next;
free(cur);
ll->size--;
return 0;
}
return -1;
}
我的主要功能的代碼片段:
case 1:
printf("Input an integer that you want to add to the linked list 1:\n");
scanf("%d", &i);
j = insertSortedLinkedList(&ll1, i);
printf("Linked list 1 : ");
printList(&ll1);
break;
case 2:
printf("Input an integer that you want to add to the linked list 2:\n");
scanf("%d", &i);
j = insertSortedLinkedList(&ll2, i);
printf("Linked list 2 : ");
printList(&ll2);
break;
case 3:
sortedMerge(&ll1, &ll2, &resultMergedList);
printf("The resulting linked list is:\n");
printList(&resultMergedList);
break;
所以我為l1輸入了2,4,6
,為l2輸入了1,2,3
。 預期輸出應為1,2,2,3,4,6
。 但是,我收到4229048, 4228432, 4228565, 0
。 我在想是不是因為我得到的輸出是內存位置?
有任何想法嗎? 提前致謝。
正如 kcraigie 所指出的,您應該使用item
創建一個新節點。 編譯器應該警告您正在傳遞一個需要整數的指針。
快速修復似乎是這樣的:
removeNode(l1, 0);
insertNode(result, index++, l1->head->item);
但事實並非如此: removeNode
會改變l1
的頭部,這很可能是NULL
。 取消引用NULL
可能會給您帶來分段違規。
該修復還有其他問題:如果成功,它會在移除的頭部之后添加節點的項目。 所以做這樣的事情:
int item = l1->head->item;
removeNode(l1, 0);
insertNode(result, index++, item);
更正后,您的合並仍未完成:您最終會遇到其中一個列表為空的情況。 你不處理那個案子。
而且還有改進的余地。 您采用簡單的方法,只需銷毀列表並創建一個具有相同數據的新列表。 這是您問題的有效解決方案,但只需重新排列(或重新鏈接)現有節點即可解決問題。
這是合並列表的方法的更正版本:
void sortedMerge(LinkedList *l1, LinkedList *l2, LinkedList *result)
{
int index = 0;
while (l1->size > 0 && l2->size > 0) {
if (l1->head->item < l2->head->item) {
int item = l1->head->item;
removeNode(l1, 0);
insertNode(result, index++, item);
} else {
int item = l2->head->item;
removeNode(l2, 0);
insertNode(result, index++, item);
}
}
while (l1->size) {
int item = l1->head->item;
removeNode(l1, 0);
insertNode(result, index++, item);
}
while (l2->size) {
int item = l2->head->item;
removeNode(l2, 0);
insertNode(result, index++, item);
}
}
您可以將重復的刪除和插入重構為一個新函數。
您正在使用 l1->head 而不是 l1->head->item 在結果鏈表上調用 insertNode()。
相反,在釋放它之前嘗試插入頭部的項目以獲取結果:
while (l1->size > 0 && l2->size > 0) {
if (l1->head < l2->head) {
insertNode(result, index++, l1->head->item);
removeNode(l1, 0);
} else {
insertNode(result, index++, l2->head->item);
removeNode(l2, 0);
}
}
此外,當您的一個列表用完時,您會退出並忽略另一個列表中的剩余項目。 您可以在上述循環后添加此代碼:
while (l1->size > 0) {
insertNode(result, index++, l1->head->item);
removeNode(l1, 0);
}
while (l2->size > 0) {
insertNode(result, index++, l2->head->item);
removeNode(l2, 0);
}
不是最有效的,但它應該有效。
示例合並排序列表函數,以及使用指向列表節點的指針數組的排序列表函數以及合並列表函數來實現鏈表的快速排序。
NODE * MergeLists(NODE *pSrc1, NODE *pSrc2)
{
NODE *pDst = NULL; /* destination head ptr */
NODE **ppDst = &pDst; /* ptr to head or prev->next */
if(pSrc1 == NULL)
return pSrc2;
if(pSrc2 == NULL)
return pSrc1;
while(1){
if(pSrc2->data < pSrc1->data){ /* if src2 < src1 */
*ppDst = pSrc2;
pSrc2 = *(ppDst = &(pSrc2->next));
if(pSrc2 == NULL){
*ppDst = pSrc1;
break;
}
} else { /* src1 <= src2 */
*ppDst = pSrc1;
pSrc1 = *(ppDst = &(pSrc1->next));
if(pSrc1 == NULL){
*ppDst = pSrc2;
break;
}
}
}
return pDst;
}
#define NUMLISTS 32 /* size of aList[] */
NODE * SortList(NODE *pList)
{
NODE * aList[NUMLISTS]; /* array of lists */
NODE * pNode;
NODE * pNext;
int i;
if(pList == NULL) /* check for empty list */
return NULL;
for(i = 0; i < NUMLISTS; i++) /* zero array */
aList[i] = NULL;
pNode = pList; /* merge nodes into aList[] */
while(pNode != NULL){
pNext = pNode->next;
pNode->next = NULL;
for(i = 0; (i < NUMLISTS) && (aList[i] != NULL); i++){
pNode = MergeLists(aList[i], pNode);
aList[i] = NULL;
}
if(i == NUMLISTS)
i--;
aList[i] = pNode;
pNode = pNext;
}
pNode = NULL; /* merge array into one list */
for(i = 0; i < NUMLISTS; i++)
pNode = MergeLists(aList[i], pNode);
return pNode;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.