您好,登錄后才能下訂單哦!
單鏈表實現分帶頭節點鏈表和不帶頭節點鏈表:
使用頭文件如下:
struct LinkNode { void *x; struct LinkNode *next; };
一,帶頭節點的鏈表:
1,鏈表創建
程序說明:
1)函數調用形式:szyu_link_create0("AA", "BB", NULL);其中NULL結尾是在for循環的判斷結束條件為x == NULL。使用NULL可以是for循環正常退出
2)程序先創建頭節點head,并初始化head節點
3)聲明指向尾節點的last,并用head進行初始化。
4)for循環中第一次使用的x是入參中的x。
5)初始化新增節點,并將尾節點的next指針指向新增節點。并將尾節點指向新增節點
6)使用了va_start()記得結尾使用va_end()
7)新增第一個節點時使用last->next = node。此時的last和head是相等的。相當于head->next = node。
struct LinkNode *szyu_link_create0(void *x, ...) { struct LinkNode *head = NULL; head = (struct LinkNode *)malloc(sizeof(struct LinkNode)); if ( head == NULL ) { return head; } head->next = NULL; struct LinkNode *last = head; va_list args; va_start(args, x); for ( ; x ; x = va_arg(args, void *) ) { struct LinkNode *node = NULL; node = (struct LinkNode *)malloc(sizeof(struct LinkNode)); if ( node == NULL ) { return head; } node->x = x; node->next = NULL; last->next = node; last = node; } va_end(args); return head; }
2,鏈表插入
程序說明:
1)key < 1保證插入的下標不能出現比一小;key - 1 > len保證在鏈表最后面能插入節點。
2)cnt = 1而不是0是保證節點停留在插入位置的前一節點。
3)添加節點到相應的位置即可。
struct LinkNode *szyu_link_insert0(struct LinkNode *head, void *x, int key) { if ( head == NULL ) { return head; } int len = szyu_link_length(head); if ( key < 1 || key - 1 > len ) { return head; } struct LinkNode *insert = head; int cnt = 1; for ( ; cnt < key; cnt++ ) { insert = insert->next; } struct LinkNode *node = NULL; node = (struct LinkNode *)malloc(sizeof(struct LinkNode)); if ( node == NULL ) { return head; } node->x = x; node->next = insert->next; insert->next = node; return head; }
3,鏈表長度獲取
程序說明:
1)過掉頭節點,再開始獲取長度。
int szyu_link_length(struct LinkNode *head) { if ( head == NULL ) { return 0; } struct LinkNode *plen = head->next; int length = 0; for ( ; plen != NULL; plen = plen->next ) { length++; } return length; }
4,鏈表打印:
程序說明:
1)如果鏈表為空,獲取只有頭節點,則直接返回。
2)輸出時,由于結構體存的void *,故輸出需進行類型轉換才行。
void szyu_link_print0(struct LinkNode *head) { if ( head == NULL || head->next == NULL ) { return; } struct LinkNode *print = head->next; int len; for ( len = 0; print != NULL; print = print->next ) { printf("%s ", (char *)print->x); } printf("\n"); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。