学习了结构体和指针后,觉得自己应该要写一些东西的必要了。
对于函数传值和传地址有了一些简单的了解。
巩固了一些简单的编程方法,其中出现了好几次segment default。
要了解指针使用了存放地址的,什么类型那的指针操作什么类型的数。
先附上代码吧,然后一步一步解释
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct _st_node
{
int data;
struct _st_node *next;
}st_node;
int init_list(st_node **head);
void insert_list_head(st_node **head, int data);
// 回调函数
int print_data(st_node *node);
//int print_total(st_node *node);
void insert_list_tail(st_node **head, int data);
void traval_list(st_node *head, int (*proc)(st_node *node) ); //定义一个函数指针,为不同
//打印方式创造可能。
void destroy_list(st_node **head);
int main(int argc,char **argv)
{
st_node *head=NULL;
int i;
init_list(&head);
for(i=0;i<10;i++)
{
int data=i+1;
insert_list_tail(&head,data); //传地址,栈区内容退出花括号就消亡(就不归它管)
}
traval_list(head,print_data);
destroy_list(&head);
traval_list(head,print_data);
return 0;
}
int init_list(st_node **head)
{
*head=NULL;
printf("init_list is ok\n");
return 0;
}
void insert_list_tail(st_node **head, int data)
{
st_node *new_node=NULL;
st_node *ptr_node=NULL;
new_node=malloc(sizeof(st_node));
memset(new_node,0,sizeof(*new_node));
new_node->data=data;
new_node->next=NULL;
if(*head==NULL)
{
*head=new_node;
}
else
{
ptr_node=*head;
while(ptr_node->next!=NULL)
{
ptr_node=ptr_node->next;
}
ptr_node->next=new_node;
}
#if 0
ptr_node=*head;
if(ptr_node->next!=NULL)
{
ptr_node=ptr_node->next;
}
ptr_node->next=new_node;
#endif
}
void insert_list_head(st_node **head, int data)
{
st_node *new_node=NULL;
new_node=malloc(sizeof(st_node));
memset(new_node,0,sizeof(*new_node));
new_node->data=data;
new_node->next=NULL;
new_node->next=(*head);
(*head)=new_node;
}
int print_data(st_node *node)
{
//st_node *ptr_node;
//for(ptr_node=node;node!=NULL;node=node->next)
if(NULL == node) //链表为空
{
printf("PrintList函数执行,链表为空\n");
}
else
{
for(;node!=NULL;node=node->next)
{
printf("%d\n",node->data);
}
}
return 0;
}
//int print_total(st_node *node);
void traval_list(st_node *head, int (*proc)(st_node *node) )
{
(*proc)(head);
}
void destroy_list(st_node **head)
{
st_node *ptr_node=NULL;
ptr_node=*head;
for(;ptr_node!=NULL;ptr_node=*head)
{
(*head)=(*head)->next;
printf("free the data:%d\n",ptr_node->data);
free(ptr_node);
}
}