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;
     } 
    
  • 相关阅读:
    记第一场省选
    POJ 2083 Fractal 分形
    CodeForces 605A Sorting Railway Cars 思维
    FZU 1896 神奇的魔法数 dp
    FZU 1893 内存管理 模拟
    FZU 1894 志愿者选拔 单调队列
    FZU 1920 Left Mouse Button 简单搜索
    FZU 2086 餐厅点餐
    poj 2299 Ultra-QuickSort 逆序对模版题
    COMP9313 week4a MapReduce
  • 原文地址:https://www.cnblogs.com/fanhua666/p/11469870.html
Copyright © 2011-2022 走看看