zoukankan      html  css  js  c++  java
  • 链表详解

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

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

    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! 
    ");
    		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("
    ");
    } 
    
    • 删除链表
    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
    ", 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 !
    "); 
    	scanf("%d",&target);
    	p = search(target);
    	if(p == NULL)
    	{
    		printf("can't find num: %d", p);
    	}else
    	{
    		printf("%p %d %d
    ", p, target, p->data);
    		rm_node(p);
    		free_node(p);
    	}
    	traverse();
    	destroy();
    	traverse();
    	
    	return 0;
     } 
    
  • 相关阅读:
    _1_html_框架
    _0_web_基础
    _0_工具
    虚拟机安装与使用
    NumPy数据类型
    NumPy Ndarray对象
    机器学习之K-近邻(KNN)算法
    vue项目如何打包扔向服务器
    Eslint 规则说明
    Python ssh 远程执行shell命令
  • 原文地址:https://www.cnblogs.com/fanhua666/p/11469870.html
Copyright © 2011-2022 走看看