連結串列
typedef struct msgdata { char msgtype; char text[27]; }link_data; typedef struct msglist { link_data data; struct msglist * next; }linknode,*linklist;
建立連結串列思路:
首先建立兩個結點,即頭結點和尾結點;
然後建立一個函式:在函式內建立一個結點,並分配記憶體空間;尾結點指向該結點,該結點的next指向空,並返回該結點的指標。返回的結點即為頭結點
listhead = creatlist(); linklist listhead,listtail; linklist creatlist(){ linklist h; h=(linklist)(malloc(sizeof(linknode)); listtail =h; h->next=NULL; return h; }
插入結點思路:
建立一個函式,傳入引數為結點的資料,在函式內部建立一個結點並分配記憶體空間,連結串列的最後一位next指向該結點,更新尾指標,
然後為尾結點賦值,並將尾結點的next指向空。成功返回0,失敗返回-1。
int insertlist(link_data x){ linklist h=(linklist)(malloc(sizeof(linknode)); if(h==NULL) { printf("error"); return -1; } listtail->next=h; listtail=h; h->data=x; h->next=NULL; return 0; }
判斷結點是否為空的思路:
傳入一個結點,如果該節點的next指向為空則連結串列結束
int emptylist(linklist h){ return h->next==NULL;}
讀取並刪除一個結點的思路:
該函式的引數為一個頭結點,返回值為提取的結點。首先在函式內部判斷該連結串列是否為空,如為空返回NULL;建立一個結點指向頭結點的下一個結點,即第一個結點,也就是
我們要提取的結點,儲存一下它的地址;然後讓頭結點指向該結點的下一個結點,然後判斷該節點的下一個結點是否為空,如果為空,則提取該結點後,連結串列為空,要讓尾結點
也指向頭結點。最後返回提取的結點。
linklist deletelist(linklist h){ if(emptylist(h)){ return NULL; } linklist q; q=h->next; h->next=q->next; if(q->next==NULL) { linktail=h; } return q; }