數據結構學習(一)

教訓是慘痛的!!!這是我所學習的第一個簡單程序。肯定一個鏈表須要什麼?在單鏈表中,也就是一個頭指針;不管是進行什麼樣的基本操做:插入,刪除、遍歷、等等。都須要頭指針,可是因爲對此方面知識的忽略,我一直也沒有考慮這個問題,致使了下面的這個程序的莫名其妙的段錯誤;讓我噁心了好幾天。數據結構

#include<stdio.h>
#include<stdlib.h>學習

struct List
{
int data;
List * next;
};指針

void initList(List * L)//初始化鏈表
{
L = (List *)malloc(sizeof(List));
if (L == NULL)
exit(-1);
else
L->next = NULL;
}
/*在第i個元素前面插入元素element*/
int insertList(List * L, int i, int element)
{
int j = 0;
List * p = L;
List * q;調試

while (p != NULL && j<i-1)
{
p = p->next;
j++;
}element

if (p == NULL || j>i-1)
return -1;it

q = (List *)malloc(sizeof(List));
if (q == NULL)
exit(-1);
q->data = element;
q->next = p->next;
p->next = q;

return 1;
} io

void traverseList(List *L)
{
List * p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("/n");
}變量


int main(void)
{
List L1;原理

/*此句自己並無什麼錯誤,可是在單鏈表中就是大錯*/List

initList(&L1);//L1是一個變量,將這個參數傳遞以後,malloc()所建立的地址空間就存放在了這個變量中。
for (int i = 1; i<=5; i++)
insertList(&L1, 1, i);//調用insertList()以後,首先建立了一個節點,以後依次建立了2, 3, 4, 5首先生成的節點最後被訪問,這爲遍歷的段錯誤埋下了坑。
traverseList(&L1);

/*

遍歷以L1地址開頭的節點:因爲初始化沒有起到任何做用,因此也就沒有了指針域爲空的時候,因此會出現段錯誤,因此在用GDB調試的時候,當i爲1,2,3,4,5時輸出正確,爲何再一次循環以後,原本應該爲空的地址會出現地址值。緣由皆在此。

 

*/

return 0;
}

 

學習數據結構時,在看別人的代碼的時候,首先將原理搞清楚,弄明白;許多讓人百思不得起解的問題也許很簡單。這是個人感覺。

相關文章
相關標籤/搜索