第一个是单向循环,第二个是单链表(总结在最后)
创建
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);
}
总结
- 单链表创建时头结点尾 = NULL; 循环链表的头结点尾 = head;
- 考虑的循环链表的尾->head,因此在条件书写时需要特别注意p的->位置是不是head
- 当考虑到head时,其他的程序基本一样,
- 中间插入,大小排序,需要知道2个结点的地址才能连接,但是删除,查找只需要一个结点地址就可以了
- 在思考条件的时候,因为我们创建的是一个带有表头的结点,因此可以假设次链表中存在多个结点的情况,让p->head,在按照需要使用的方法分析插入(意思就说假设含有表头和之后的2个结点考虑),我在编写代码是这样思考,如果有不严谨的地方,希望大家指出,谢谢。