/*隨意輸入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;
}