程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c-鏈表的一個錯誤,找了很久也沒發現為什麼錯了。。。

c-鏈表的一個錯誤,找了很久也沒發現為什麼錯了。。。

編輯:編程綜合問答
鏈表的一個錯誤,找了很久也沒發現為什麼錯了。。。

/*隨意輸入n個數字,作為線性鏈表,遍歷該列表返回輸入值最小節點的關鍵字*/

#include
#include
#include
#include

struct example
{
int input;
int keyword;
struct example* next;
};

typedef struct example EXAMPLE;

int main (void)
{
EXAMPLE* head;
EXAMPLE* p;
EXAMPLE* pre;
EXAMPLE* po;
EXAMPLE* pMin;
int n;
int i;

printf("n = ? ");
scanf("%d",&n);

head = (EXAMPLE*)malloc(sizeof(EXAMPLE));
pre = head;

for(i = 1; i <= n; i++)
{
    printf("input = ? ");
    scanf("%d",&pre->input);
    pre->keyword = i;

    p = (EXAMPLE*)malloc(sizeof(EXAMPLE));
    pre->next = p;
    pre = p;
}

pre = NULL;

po = head;
while(po)
{
    printf("%d   %d\n",po->keyword, po->input);
    po = po->next;
}

p = head->next;
pMin = head;   //好像就是這裡出了問題,但不知為什麼

/* while(p)
{
if(pMin->input > p->input)
pMin = p;
p = p->next;
}*/

printf("min : %d   %d\n",pMin->keyword, pMin->input);



return 0;

}

最佳回答:


你實際malloc的空間是給p的,pre只是指向這塊空間。退出循環後,你只是讓pre指向了NULL,與鏈表中的節點完全沒關系啊。
所以後面你while(po)的時候,很大概率不會因為NULL結束,printf的時候就會段錯誤了。如果沒有那也是意外,因為剛好那塊內存是NULL。
你的邏輯有問題,應該是每次malloc完,判斷下返回值,然後就填充該節點,然後加入鏈表中。
現在你在一個循環中,是先給之前的節點賦值,再分配新的節點空間,就會導致最後一個分配的節點裡面的數據是不確定的(因為你malloc後沒有清零操作)僅供參考
/*隨意輸入n個數字,作為線性鏈表,遍歷該列表返回輸入值最小節點的關鍵字*/

#include

struct example
{
int input;
int keyword;
struct example* next;
};

typedef struct example EXAMPLE;

int main (void)
{
EXAMPLE* head;
EXAMPLE* p;
EXAMPLE* pre;
EXAMPLE* po;
EXAMPLE* pMin;
int n;
int i = 1;

printf("n = ? ");
scanf("%d",&n);

head = (EXAMPLE*)malloc(sizeof(EXAMPLE));
if(NULL == head)
{
printf("no memory\n");
return 0;
}

printf("input = ? ");
scanf("%d",&head->input);
head->keyword = i;
head->next = NULL;
i++;

pre = head;
for(; i <= n; i++)
{
p = (EXAMPLE*)malloc(sizeof(EXAMPLE));
printf("input = ? ");
scanf("%d",&p->input);
p->keyword = i;
p->next = NULL;

pre->next = p;  
pre = p;   

}

po = head;
while(po)
{
printf("%d %d\n",po->keyword, po->input);
po = po->next;
}

p = head->next;
pMin = head; //好像就是這裡出了問題,但不知為什麼
while(p)
{
if(pMin->input > p->input)
pMin = p;
p = p->next;
}

printf("min : %d %d\n",pMin->keyword, pMin->input);

return 0;
}


xjznq2010
xjznq2010
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved