链表详解
好久没看链表了,今天回忆起来好陌生,觉得还是写下来比较好
链表先从最简单的单向头指针链表开始
- 结构体的定义:
链表上有两个节点,一个是用来存放数据的一个是用来连接下一个链表的指针类型。
- 先定义一个结构体:
typedef struct node
{
int data; //设置数据
struct node *next; //指向其后继信息
}node_t;
-
让头指向空:node_t *head = NULL;
-
然后定义一个创建链表的函数:
node_t *mk_node(int data)
{
node_t *p = (node_t *)malloc(sizeof(node_t));
if (p == NULL)
{
printf("malloc default! \n");
exit(1);
}
p->data = data;
p->next = head;
return p;
}
- 接下来是释放函数:
void free_node(node_t *p)
{
free(p);
}
- 插入链表:
void insert(node_t *p)
{
p->next = head;
head = p;
}
- 寻找结构体
node_t *search(int target)
{
node_t *p = head;
while(p != NULL)
{
if(target == p->data)
{
return p;
}
p = p->next;
}
return NULL;
}
- 将自己的链表遍历出来:
void traverse()
{
node_t *p = head;
while(p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
- 删除链表
void rm_node(node_t *p)
{
node_t *pre = head;
if(p == head)
{
head = head->next;
p->next = NULL;
return;
}
while(pre->next != NULL)
{
if(pre->next == p)
{
pre->next = p->next;
return;
}
pre = pre->next;
}
}
- 销毁链表
void destroy()
{
node_t *p;
while(head != NULL)
{
p = head;
head = head->next;
free_node(p);
}
}
- 主函数
int main(int argc, char *argv[])
{
// printf("%d %s\n", argc, argv[0]);
// int a = 8;
// printf("%d %d", a, ++a);
// return 0;
node_t *p;
int target;
p = mk_node(1);
insert(p);
p = mk_node(2);
insert(p);
p = mk_node(3);
insert(p);
p = mk_node(4);
insert(p);
traverse();
printf("please give me a number !\n");
scanf("%d",&target);
p = search(target);
if(p == NULL)
{
printf("can't find num: %d", p);
}else
{
printf("%p %d %d\n", p, target, p->data);
rm_node(p);
free_node(p);
}
traverse();
destroy();
traverse();
return 0;
}
身体是1,财富·名利·是0,没有1有再多的0都没有用!!