『壹』 高分求一個刪除單鏈表中值為x的所有元素的函數
NODE *newlist(NODE *L,int x)
{
NODE * t ;//聲明一個代替根節點L的節點
if(L.value == x){//根節點的值為x
t = L->next; //將T指向L的下一個節點
delete L; //刪除L節點
return newlist(t,x);//遞歸處理首節點值為x的情況
}
t = L; //將t指向根節點
while(t->next != null){ //節點的下一個節點不為空
if(t->next.value == x){ //滿足條件
t->next = t->next->next; //刪除滿足條件的節點
}
}
return t;
}
我是這么理解的
先判斷首節點的值
若首節點滿足則將首節點的下一節點保存下來
遍歷下一節點
若不滿足則對下一節點進行判斷
遍歷玩整個鏈表即可
應該是比較簡單的啊
思路很清晰的啊
【呵呵
見笑了
剛寫的
沒在VS里運行呢
是忘了加t=t->next了
我是搞java的
想翻翻c++
見笑了
呵呵
我看了下二樓的
貌似可以】
『貳』 7.試設計實現刪除單鏈表中值相同的多餘結點的演算法
.....做題啊
解:該例可以這樣考慮,先取開始結點的值,將它與其後的所有結點值一一比較,發現相同的就刪除掉,然後再取第二結點的值,重復上述過程直到最後一個結點。
設單鏈表(其類型為LinkList)的頭指針head指向頭結點,則可按下列步驟執行:
首先,用一個指針p指向單鏈表中第一個表結點,然後用另一個指針q查找鏈表中其餘結點元素,由於是單鏈表,故結束條件為p= =NULL,同時讓指針s指向q所指結點的前趨結點,當查找到結點具有q->data= =p->data時刪除q所指的結點,然後再修改q,直到q為空;然後使p指針後移(即p=p->next),重復進行,直到p為空時為止。演算法描述如下:
del(LinkList *head)
{ //刪除單鏈表中值相同的多餘結點
LinkList *p, *s, *q;
p=head->next;
while(p!=NULL && p->next!=NULL)
{ s=p; //s指向要刪除結點的前趨
q=p->next;
while (q!=NULL)
{ if (q->data= =p->data)} //查找值相同的結點並刪除
{ s->next=q->next;
free(q);
q=s->next;
}
else
{ s=q;
q=q->next;
}
}
p=p->next;
}
}
『叄』 求設計一個演算法
因為我是學計算機軟體專業的。故我可以很負責任的告訴你:你的這個要求是沒有人能夠滿足的。理由如下:
(1)、首先鏈表在計算機軟體專業的《數據結構》課程中,應該算是最、最復雜的一種數據結構了,它比對數組、堆棧、隊列等的操作要來得復雜得多。原因就是在涉及到對各種鏈表(單鏈表、雙鏈表等)的編程中,都必須要定義一個(或者多個)指針變數,用來表示單鏈表(或者是雙鏈表)。而指針又是 C 語言中功能最為強大、但是同時也是概念最難於理解、而且對於 C 語言中的指針部分的代碼又是最難於調試的;
(2)、除了上述的(1)之外,你的要求中又涉及到了《數據結構》課程中的排序演算法、以及對鏈表的各種操作(首先要查找到所需要刪除的節點、然後再從單鏈表中進行刪除。而且了,刪除了節點之後,對原來的單鏈表還需要重新進行排序)
(3)、編寫、並且調試通過一個 C 語言源代碼並非一件易事,編寫任何一個程序,都必須要在一個集成的編程調試環境中,通過對各個變數設置斷點、對整個程序進行單步跟蹤,才能夠最終調試通過該程序。
故你的要求是不可能通過別人的編程來實現的,而必須依靠自己的艱苦努力去調試通過程序。
以上就是我多年編程的親身體會。