教训是惨痛的!!!这是我所学习的第一个简单程序。肯定一个链表须要什么?在单链表中,也就是一个头指针;不管是进行什么样的基本操做:插入,删除、遍历、等等。都须要头指针,可是因为对此方面知识的忽略,我一直也没有考虑这个问题,致使了下面的这个程序的莫名其妙的段错误;让我恶心了好几天。数据结构
#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;
}
学习数据结构时,在看别人的代码的时候,首先将原理搞清楚,弄明白;许多让人百思不得起解的问题也许很简单。这是个人感觉。