最近從Linux C數據結構和算法學起,下面是一個單向鏈表的寫法,代碼如下:
[cpp] view
plain copy
#include <stdio.h>
#include <malloc.h>
int n=0;
typedef struct code
{
int data;
struct code *next;
}List;
List *creatlink()
{
List *head;
List *p1;
List *p2;
head=NULL;
p1=(List *)malloc(sizeof(List));
p2=(List *)malloc(sizeof(List));
printf("Please print the data you want:(end is 0)\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(List *)malloc(sizeof(List));
scanf("%d",&p1->data);
// printf("\n%d\n",p1->data);
}
free(p1);
p2->next=NULL;
return(head);
}
void Print(List *head)
{
List *p;
p=head;
if(head!=NULL)
do
{
printf("[%d]->",p->data);
p=p->next;
}
while(p!=NULL);
printf("\nover!\n");
}
int main()
{
List *head;
head=creatlink();
Print(head);
return(0);
}
結果如下:
單向鏈表建立容易犯錯誤的是這一塊:
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(List *)malloc(sizeof(List));
scanf("%d",&p1->data);
// printf("\n%d\n",p1->data);
}
先判定頭指針,然後再重新為p1申請一片內存,來存放下一個鏈表裡的內容
malloc()最容易出現的問題是內存洩露,所以一定要記得free();
下面有個例子:
兄弟問:" free(p);p=NUll;",為啥free(p)之後,還要置p=NULL呢?有必要麼?
free(p)只是將p指向的空間釋放掉了,但是p並不等於NULL;
code:
int main()
{
int *p;
p = (int *)malloc(sizeof(int) * 10);
printf("before free: p=%p\n",p);
free(p);
printf("after free: p = %p\n",p);
printf("%d\n",p[0]);
p=NULL;
printf("%d\n",p[0]);
}
result:
before free: p=0x8fa7008
after free: p = 0x8fa7008
0
段錯誤
也就是p雖然有值,但其指向的空間已經被釋放掉了。如果在後續的code中再用到p,就會出現錯誤,而這種錯誤是不太明顯的。如果顯式的置為null的話,就可以使錯誤馬上顯現出來。從而避免了調試程序中種種詭異的麻煩。
結論:
如果在程序中free(p)之後,p不會再用,則令p=NULL無所謂。
如果在程序中free(p)之後,p還會用到,則令p=NULL,還原p為純淨的變量,便於以後差錯。