摘自:
有乙個雙向迴圈鍊錶鍊錶1和鍊錶2,將這兩個鍊錶中重複的元素刪除,並將這兩個鍊錶中相同的元素刪除。例如鍊錶1中輸入的元素是2,1,3,4,1;鍊錶2是3,1,4,5,6,;則輸出鍊錶1為2,;鍊錶2為5,6;
演算法思想:在鍊錶1中查詢重複的元素,如果有的話將重複的第二個以上的元素刪除,留乙個元素,之後將這個元素與鍊錶2的所有元素比較,如果鍊錶2中有元素與這個元素相等就將鍊錶2的這個元素刪除,無論鍊錶2有無元素與這個元素相等,都將鍊錶1中的這個元素刪除。之後再鍊錶2將自身重複的元素刪除既可。
#include
#include
struct stud
;void main()
printf("請輸入乙個數/n");
p=(struct stud *)malloc(sizeof(struct stud));
scanf("%d",&p->data);
while(p->data!=1000)
printf("請輸入乙個數/n");
q=(struct stud *)malloc(sizeof(struct stud));
scanf("%d",&q->data);
while(q->data!=1000)
printf("/n現在輸出第二個鍊錶/n");
q=head2->next;
while(q!=head2)
p=head1->next;
q=head1->next;
while(p!=head1)
else
q=q->next;
}else
q=q->next;
}q1=head2->next;
while(q1!=head2)/*鍊錶2中有與鍊錶1中相同的元素就將它刪掉*/
else
q1=q1->next;
if(count>=2||flag))/*演算法關鍵所在,若在在鍊錶1中的乙個數,在鍊錶1中出現了2次,或在鍊錶2中出現過,就將鍊錶1中這個數刪除掉*/
else
p=p->next;
}p=head2->next;
q=head2->next;
while(p!=head2)
else
q=q->next;
}else
q=q->next;
}if(count>=2)/*將鍊錶2中的重複元素刪除*/
else
p=p->next;
}printf("/n刪除兩個鍊錶中相同的元素之後的結果是,現在輸出第乙個鍊錶/n");
p=head1->next;
while(p!=head1)
printf("/n現在輸出第二個鍊錶/n");
q=head2->next;
while(q!=head2)
printf("/n現在開始釋放記憶體/n");
p=head1->next;
while(p!=head1)
printf("鍊錶1釋放完畢/n");
p=head2->next;
while(p!=head2)
printf("鍊錶2釋放完畢/n");
延伸閱讀:
《程式設計之美》豆瓣
《程式設計之美》互動網
《程式設計之美》,
it人求職面試必讀
牛客網 華為筆試題 迴圈鍊錶
有乙個陣列a n 順序存放0 n 1,要求每隔兩個數刪掉乙個數,到末尾時迴圈至開頭繼續進行,求最後乙個被刪掉的數的原始下標位置。以8個數 n 7 為例 0,1,2,3,4,5,6,7 0 1 2 刪除 3 4 5 刪除 6 7 0 刪除 如此迴圈直到最後乙個數被刪除。迴圈鍊錶 尾部節點的next指標...
雙向迴圈鍊錶的實現詳解
雙向迴圈鍊錶直接體現為雙向和迴圈,一般的單鏈表只有節點資料data和next指向位址 應該也是引用的意思 而在此需要增加前面部分的pre指向位址,同時還需要迴圈 迴圈則在定義節點時可以解決,如下所示 雙向可以假想三個節點,實際上就是3個節點之間完成pre和next的指向替換,如下圖所示 原來的下乙個...
中興通訊2012筆試題刪除雙向迴圈鍊錶中相同的數值
雙向迴圈鍊錶pheada pheadb,例如 pheada 資料為 1,2,3,4,5,7 pheadb資料為 1,2,6,2,1,7,3 刪除相同數值後為 pheada 4,5 pheadb 6 include using namespace std typedef struct doubleli...