源码,经典。
CARD *myinsert(LCARD *head, LCARD *insert)
{
LCARD *temp = NULL;
if (head==NULL)//链表为空
{
head = insert;
insert->next = insert;
insert->prior = insert;
}
else//链表非空
{
temp = head;
if (head->cardnum>insert->cardnum)//插入到头前边,并且把自己当作头
{
head->prior->next = insert;
insert->prior = head->prior;
insert->next = head;
head->prior = insert;
head = insert;
}
if (insert->cardnum0cardnumcardnum)&&(temp->next!=head))//循环
{
temp = temp->next;
}
if (temp->cardnum>insert->cardnum)//第一个条件终止的
{
temp->prior->next = insert;
insert->prior = temp->prior;
insert->next = temp;
temp->prior = insert;
}
else//第二个条件终止的
{
head->prior->next = insert;
insert->prior = head->prior;
insert->next = head;
head->prior = insert;
}
}
else//大于50反向插入
{
while ((temp->cardnum>insert->cardnum)&&(temp->prior!=head))//循环,第二个条件禁止跑飞
{
temp = temp->prior;
}
if (temp->cardnumcardnum)//只有第一个条件可以终止的
{
temp->next->prior = insert;
insert->next = temp->next;
insert->prior = temp;
temp->next = insert;
}
}
}
//printf("%d\t%d\n", insert->id, insert->cardnum);
return head;
}
void swap_id(SWID *sw)
{
LCARD *temp = sw->head;
if (sw->head->cardnum==sw->swapcardnum)
{
printf("out person cardnum=%d\n", sw->head->id);
sw->head->id = sw->inID;
return ;
}
if ((sw->swapcardnum0)cardnum!=sw->swapcardnum)&&(temp->next!=sw->head))
{
temp = temp->next;
}
if (temp->cardnum==sw->swapcardnum)
{
printf("out person cardnum=%d\n", sw->head->id);
temp->id = sw->inID;
}
}
else
{
while ((temp->cardnum!=sw->swapcardnum)&&(temp->prior!=sw->head))
{
temp = temp->prior;
}
if (temp->cardnum==sw->swapcardnum)
{
printf("out person cardnum=%d\n", sw->head->id);
temp->id = sw->inID;
}
}
}
LCARD *mydel(LCARD *head, LCARD *del)
{
LCARD *temp = NULL;
if (head==NULL)//没有链表
{
printf("there is no card\n");
}
else//有链表
{
if(head->next==head)//链表里就有一个节点并且为头结点
{
if (head->cardnum==del->cardnum)
{
free(head);
head = NULL;
}
else
{
printf("in mydel error\n");
}
}
else//链表里有超过一个的节点
{
temp = head;
if (del->cardnum0cardnum!=del->cardnum)&&(temp->next!=head))
{
temp = temp->next;
}
if (temp->cardnum==del->cardnum)
{
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
}
}
else//反向删除
{
while ((temp->cardnum!=del->cardnum)&&(temp->prior!=head))
{
temp = temp->prior;
}
if (temp->cardnum==del->cardnum)
{
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
}
}
}
}
return head;
}
1