1:设计一个算法用于判断带头结点的循环双链表是否对称
int judgebalance(pNode **head) { pNode *p,*q; p=*head->next;//指向下一个正序 q=*head->prev;//指向前一个逆序 /*我的思路 while(p->data==q->data)//对应的位置值相等 { p=p->next; q=q->next; if(p==q)//奇数个数指向同一地址 { printf("对称"); return 1; break; } else if(p->next==q&&q->prev==p)//偶数个数 { printf("对称"); return 1; break; } } return 0; */ //另一种书上的 while(p!=q&&p->next!=q->prev) { if(p->data==q->data) { p=p->next; q=q->prev; } else return 0; } return 1; }
2:有两个循环单链表,链表头指针针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。
单链表定义
struct Nodet { int a; struct Nodet* next; }
正文
void mergeh(Nodet &h1,Nodel &h2) { Nodet *p,*q,*pp,*qq; p=pp=h1; q=qq=h2; while(p->next!=pp) { p=p->next; } p->next=q; while(q->next!=qq) { q=q->next; } q->next=p; }
3:设有一个带头结点的循环单链表,其结点值均为正整数、设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该节点从中删除。直到单链表空为止,再删除表头结点。
在不空时循环,每循环一次查找一个最小节点,,记录其前驱节点,删除改点
void de(Nodet &L) { Nodet *p,*pre,*minp,*minpre; while(L->next!=L)//表不空 循环 { p=L->next;pre=L; minp=p;minpre=pre; while(p!=L)//循环一趟,找最小值 { if(p->a<minp->a)//找到 { minp=p; minpre=pre; } pre=p;//找下个节点 p=p->next; } printf("%d",minp->a); minpre->next=minp->next; free(minp); } free(L); }