(1)向后插入元素
void insert_tail(link p)
{
link q = NULL;
if(NULL == head)//判断head是否为空
{
head = p;//head为空则直接赋值
return;
}
//head不为空
//则遍历链表,直至最后一个节点
for(q = head; q->next;q=q->next);
q->next = p;//将新节点放置在最后一个节点的后面
需要将新节点的next指针置为NULL吗?为什么?
}
(2) 中间插入元素
void insert_mid(link p)
{
link q = NULL;
link r = NULL;
if(head == NULL)
return;
else
{
q = head;
p->next = q->next;
q->next = p;
}
}
(3)插入排序
void insert_sort(link p)
{
link q = NULL;
link r = NULL;
if(head == NULL)
{
head = p;
return;
}
for(q = head; q; q=q->next)
{
if(q->item > p->item)
{
p->next = q;
if(r)
r->next = p;//mid
else
head = p;//head
break;
}
r = q;
}
if(q == NULL)
{
r->next = p;//tail
}
}
(4)链表逆序
void reverse_1()
{
link head1 = NULL;
link p = NULL;
while(head != NULL)
{
p = head;
head = p->next;
p->next = head1;
head1 = p;
};
}
head = head1;
}
void reverse_2()
{
link r = NULL;
link p = NULL;
link q = NULL;
for(p = head;p;)
{
q = p->next;
p->next = r;
r = p;
p = q;
}
head = r;
}
(6) 删除 前(后)面元素
void del_3()
{
link p = NULL;
int i = 1;
for(i = 1; i <= 10; i++)
{
p = make_node(i);
insert(p);
}
p = head;
for(i = 1;i < 3;i++)
p = p->next;
printf("3: %d\n",p->item);
delete(p);
free_node(p);
}
void del_r_3()
{
link p = NULL;
link q = NULL;
link r = NULL;
int i = 1;
for(i = 1; i <= 10; i++)
{
p = make_node(i);
insert(p);
}
p = head;q = p->next;
while(q->next)
{
r = p;
p = q;
q = q->next;
}
printf("r_3: %d\n",r->item);
delete(r);
free_node(r);
}
void del_r_k(int k)
{
link p = NULL;
link q = NULL;
int i = 1;
for(i = 1; i <= 10; i++)
{
p = make_node(i);
insert(p);
}
p = head;
for(i = 1;i < k;i++)
{
if(p)
p = p->next;
else
return;
}
q = head;
for(;p->next;)
{
p = p->next;
q = q->next;
}
printf("r_k: %d\n",q->item);
delete(q);
free_node(q);
}
(7) 约瑟夫环
void josphus(int M, int N)
{
link r = NULL;
link p = NULL;
link head = NULL;
link tail = NULL;
int i = 0;
for(i = M; i >= 1; i--)
{
p = malloc(sizeof(*p));
p->item = i;
p->next = NULL;
if(head == NULL)
{
head = p;
tail = p;
}
else
{
p->next = head;
head = p;
}
}
tail->next = head;
p = head;
while(p!= p->next)
{
for(i = 1; i < N; i++)
{
r = p;
p = p->next;
}
r->next = p->next;
free(p);
p = r->next;
}
printf("%d\n",p->item);
free(p);
head = tail = NULL;
}