欢迎来到轩宇的博客

回溪照轩宇,广陌临梧楸。

链表详解

好久没看链表了,今天回忆起来好陌生,觉得还是写下来比较好

链表先从最简单的单向头指针链表开始

  1. 结构体的定义:
    链表上有两个节点,一个是用来存放数据的一个是用来连接下一个链表的指针类型。
  • 先定义一个结构体:
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;
 } 
posted @ 2019-09-05 21:20  轩宇a_a  阅读(252)  评论(0编辑  收藏  举报