(带表头结点)循环链表和单链表的增、删、改、查、

第一个是单向循环,第二个是单链表(总结在最后)

创建

void create_list(Link * head)
{
    create_new_node(head);
    (*head)->next = *head;
}

void create_list(Link *head)
{
    create_new_node(head);
    (*head)->next = NULL;
}

头插

void insert_head(Link head,Link new_node)
{
    new_node->next = head->next;
    head->next = new_node;
}
void insert_head_node(Link head,Link new_node)
{
    new_node->next = head->next;
    head->next = new_node;
}

尾插

void insert_tail(Link head,Link new_node)
{
    Link p = NULL;
    p = head;
    while(head != p->next)
    {
        p = p->next;        
    }
    p->next = new_node;
    new_node->next = head;

}

void insert_tali_node(Link head,Link new_node)
{
    Link p = NULL;
    p = head;
    while(NULL != p->next)
    {
        p = p->next;
    }  
        new_node->next = NULL;
        p->next = new_node;
}

依次排序插入

void insert_big_node(Link head,Link new_node)
{
    Link p = NULL;
    Link q = NULL;
    q = head;
    p = q->next;
    while(head != p->next && p->num < new_node->num)
    {
        q = p;
        p = p->next;
    }
        new_node->next = p;
        q->next = new_node;
}

void insert_back_node(Link head,Link new_node)
{
    Link p;
    Link q;
    q = head;
    p = q->next;
    while(NULL != q->next && p->num < new_node->num)
    {
        q = p;
        p = p->next;
    }
    new_node->next = p;
    q->next = new_node;
}

中间插入

void insert_mid_node(Link head,Link new_node,int loc)
{
    Link p;
    Link q;
    q = head;
    p = q->next;
    while(head != p->next && p->num != loc)
    {   
        q = p;
        p = p->next;        
    }
        new_node->next = p;
        q->next = new_node;
}
void insert_mid_node(Link head,Link new_node,int loc)
{
    Link p;
    Link q;
    q = head;
    p = q->next;

    while(NULL != q->next && p->num != loc)
    {
        q = p;
        p = p->next;
    }
    new_node->next = p;
    q->next = new_node;
}

查找结点数据

Link search_node(Link head,int a)
{
    Link p;
    p = head;
    
    while(head != p->next && p->num != a)
    {
        p = p->next;        
    }
        return p;
}
Link search_node(Link * head, int num_serch)
{
	Link p;
	p = *head;
	
	while (p != NULL && p->num != num_serch)
	{
		p = p->next;
	}
        return p;

删除结点数据

void del_node(Link head,int b)
{
    Link p;
    Link q;
    q = head;
    p = q->next;
   
    while(head != p->next && p->num != b)
    {   
        q = p;
        p = p->next;
    }
        q->next = p->next;
        free(p);
}

void del_node(Link head,int a)
{
    Link p;
    Link q;
    q = head;
    p = q->next;
    while(NULL != p->next && p->num != a)
    {
        q = p;
        p = p->next;
    }

    q->next = p->next;
    free(p);
}

单链表的逆序

Link list_sort(Link  head)
{
    Link p1 = NULL;
    Link p2 = NULL;
    Link p3 = NULL;

    p1 = head;
    p2 = p1->next;
    while(NULL != p2)
    {
        p3 = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = p3;
    }
        head->next = NULL;
        head = p1;
        return (head);
}

总结

  1. 单链表创建时头结点尾 = NULL; 循环链表的头结点尾 = head;
  2. 考虑的循环链表的尾->head,因此在条件书写时需要特别注意p的->位置是不是head
  3. 当考虑到head时,其他的程序基本一样,
  4. 中间插入,大小排序,需要知道2个结点的地址才能连接,但是删除,查找只需要一个结点地址就可以了
  5. 在思考条件的时候,因为我们创建的是一个带有表头的结点,因此可以假设次链表中存在多个结点的情况,让p->head,在按照需要使用的方法分析插入(意思就说假设含有表头和之后的2个结点考虑),我在编写代码是这样思考,如果有不严谨的地方,希望大家指出,谢谢。
发布了14 篇原创文章 · 获赞 0 · 访问量 412

猜你喜欢

转载自blog.csdn.net/LIGUOZHENLX/article/details/104376941