#include
using namespace std;
#include
#include
#include
/*詳細見ppt:線性表基本操作
1.可以學習的地方,函式中按值傳遞,以及引用傳遞。
如:此中initlinklist 以及destroy函式中,傳遞的都是linklist *,
但是在insertnodeat,deletenodeat,searchnode,getnodeat
等函式中使用的是linklist.
這是因為前者中linklist 傳遞前後需要變化,後者不需要變化。
另外,在getnodeat,以及searchnode 中 nodeptr * pre,也是這個道理。
2.另外就是遍歷過程中while迴圈中輸出與獲得元素的相對位置。
3.可移植性。tydedef
*/#define formatstr2 " %d "
typedef int elementtype;
typedef struct node_tag
node,*nodeptr,*linklist;
/*此中設定的nodeptr,linklist都是node*,但是不同在於
可以區分是乙個普通節點的指標,還是鍊錶中的頭結點指標。
*/// 初始化linklist的頭結點。
int initlinklist(linklist* linklist)
// 頭插法插入乙個節點。
int addnode(linklist linklist, elementtype element)
// 獲取第i個節點,以及其前驅節點pre,如果沒有則返回null,pre也為null
nodeptr getnodeat(linklist linklist ,int i,nodeptr* pre)
if(kreturn temp;
}// 在特定位置i插入乙個節點。
int insertnodeat(linklist linklist, int i, elementtype element)
// 刪除乙個特定位置i的節點。
int deletenodeat(linklist linklist, int i )
// 通過某個值來查詢某個節點。
nodeptr searchnode(linklist linklist, elementtype element, nodeptr * pre)
if(!cur) *pre=null;
return cur;
}// 通過值刪除某個節點。
int deletenode(linklist linklist, elementtype element)
nodeptr pcur;
pcur=linklist->next;
while(pcur)
printf("\n");
/*此中while 迴圈中,printf函式在pcur=pcur->next之前,類似於
檔案遍歷中的while,
如果程式改為
pcur=linklist;
while(pcur)
則出錯,因為到之後pcur=null,然後pcur->data,然後迴圈才可以結束。*/}
//銷毀linklist
void destroylinklist(linklist* linklist)
*linklist=null;
/*不斷從控制台輸入來建立node,來建linklist,輸入0表示輸入結束*/
void createlinklist(linklist linklist)
//選擇鍵值最小的 節點,以及其前驅節點。
nodeptr minmumnode(linklist linklist, nodeptr * prenode)
}return p_minnode;
}return null;
//選擇排序
nodeptr selectascentsort(linklist linklist)
}return newlinklist;
void insertsort(linklist linklist)
/*此中注意:空節點的 處理,如果原煉表中有空節點,則插入乙個節點之後還是有空節點的,即使是插在最後乙個節點之後。
因為之後乙個節點的next為null,即null 的前驅為最後乙個節點,即使是乙個節點插在最後乙個節點之後,
那麼null 還是會有的。
所以,鍊錶初始化的時候必須給尾節點的next置為null。
*//*插入節點*/
/*注意此中如果pnode_oldlist=pnode_oldlist->next的位置放在下面注釋中,
則出錯,因為在那之前pnode_oldlist已經改變了*/
ptempnode=pnode_oldlist;
pnode_oldlist=pnode_oldlist->next;
ptempnode->next=pnode_newlist;
pre_ppnode_newlist->next=ptempnode;
/*pnode_oldlist=pnode_oldlist->next;*/}}
/*帶有頭節點的單鏈表的反轉
思想: 想讓整個鍊錶反轉,先將兩個節點反轉,然後節點的 追趕。
本來是pnode1->pnode2->pnode3..
然後 逆序為pnode1<-pnode2...
然後 更新pnode1為pnode2;
更新pnode2為pnode3;(即鍊錶中節點的追趕)
*/void reverse(linklist linklist)
nodeptr pnode1=linklist->next;/*第乙個節點*/
nodeptr pnode2=pnode1->next;/*第二個節點*/
pnode1->next=null;/*第乙個節點變成了尾節點*/
nodeptr pnode3;
while(pnode2)
/*迴圈結束時,pnode2=null,pnode1為新的首節點*/
linklist->next=pnode1;
}// main
int main()
單鏈表基本操作
include include include include includeusing namespace std typedef struct node node,plinklist plinklist createfromhead node pstnode node malloc sizeof...
單鏈表基本操作
單鏈表的初始化,建立,插入,查詢,刪除。author wang yong date 2010.8.19 include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist...
單鏈表基本操作
include using namespace std define namelenth 20 define ok 0 define error 1 typedef struct flagnode node 生成結點 inline node newnode 銷毀化煉表 void destroylin...