typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node;
find(head,i)
查找\(q\)結點,查不到打印報錯信息p->next = head;
head = p;
p->next = q->next;
q->next=p;
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node; node *insert(node *head, datatype x, int i) { node *p, *q; q = find(head, i); // 查找第i個結點 if (!q && i != 0) { printf("\n找不到第%d個結點,不能插入%d!", i, x); } else { p = (node *) malloc(sizeof(node)); // 分配空間 p->info = x; // 設置新結點 if (i == 0) // 插入的結點做爲單鏈表的第一個結點 { p->next = head; head = p; } else { p->next = q->next; // 後插 q->next = p; } } return head; }
head = head->next;
free(p)
pre->next = q->next;
free(p)
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node; node *dele(node *head, datatype x) { node *pre = NULL, *p; if (!head) { printf("單鏈表是空的"); return head; } p = head; while (p && p->info != x) // 尋找被刪除結點p { pre = p; // pre指向p的前驅結點 p = p->next; } if (p) { if (!pre) // 被刪除結點沒有上一個結點,則是要刪除的是第一個結點 { head = head->next; } else { pre->next = p->next; } free(p) } return head; }
head->next
指示的typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node;
find(head,i)
查找帶頭結點的單鏈表中的第 \(i\) 個結點( \(i=0\) 表示新結點插入在頭結點以後)p->next = q->next;
q->next = p;
p->next = q->next;
q->next = p;
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node; node *insert(node *head, datatype x, int i) { node *p, *q; q = find(head, i); // 查找帶頭結點的單鏈表中的第 i 個結點,i=0 時表示新結點插入在頭結點以後 if (!q) // 沒有找到 { printf("\n帶頭結點的單鏈表中不存在第%d個結點!不能插入%d!", i, x); return head; } p = (node *) malloc(sizeof(node)); // 爲準備插入的新結點分配空間 p->info = x; // 爲新結點設置值 p->next = q->next; q->next = q; // i=0 時,本語句等價於 head->next=p return head; }
pre->next = q->next;
free(q)
pre->next = q->next;
free(q)
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node; node *dele(node *head, datatype x) { node *pre = head, *q; // pre 指向頭結點 q = head->next; // q 從帶頭結點的單鏈表的第一個實際結點開始找值爲 x 的結點 while (q && q->info != x) // 循環查找值爲 x 的結點 { pre = q; // pre 指向 q 的前驅 q = q->next; } if (q) { pre->next = q->next; // 刪除 free(q); // 釋放內存空間 } return head; }
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node;
typedef int datatype; typedef struct dlink_node { datatype info; struct dlink_node *llink, *rlink; } dnode;
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node;
typedef int datatype; typedef struct link_node { datatype info; struct link_node *next; } node; typedef struct { node *front, *rear; // 定義隊首和隊尾指針 } queue;
設計一個算法,求一個單鏈表中的結點個數node
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; int count(linklist head) { int c = 0; linklist p = head; // head爲實際的第一個結點 while (p) // 計數 { c++; p = p->next; } return c; }
設計一個算法,求一個帶頭結點單鏈表中的結點個數c++
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; int count(linlist head) { int c = 0; linklist = head->next; // head->next 爲實際的第一個結點 while (p) // 計數 { c++; p = p->next; } return c; }
設計一個算法,在一個單鏈表中值爲 y 的結點前面插入一個值爲 x 的結點。即便值爲 x 的新結點成爲值爲 y 的結點的前驅結點算法
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; void insert(linklist head, int y, int c) { linklist pre, p, s; // 假設單鏈錶帶頭結點 pre = head; p = head->next; while (p && p->data != y) { pre = p; p = p->next; } if (p) // 找到了值爲 y 的結點,即 p == y { s = (linklist) malloc(sizeof(linknode)); s->data = x; s->next = p; pre->next = s; } }
設計一個算法,判斷一個單鏈表中各個結點值是否有序函數
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; int issorted(linklist head, char c) // c='a' 時爲升序,c='d' 時爲降序 { int flag = 1; linklist p = head->next; switch (c) { case 'a': // 判斷帶頭結點的單鏈表 head 是否爲升序 while (p && p->next && flag) { if (p->data <= p->next->data) p = p->next; else flag = 0; } break; case 'd': // 判斷帶頭結點的單鏈表 head 是否爲降序 while (p && p->next && flag) { if (p->data >= p->next->data) p = p->next; else flag = 0 } break; } return flag; }
設計一個算法,利用單鏈表原來的結點空間將一個單鏈表就地轉置spa
head->next
保留上一個 \(q\) 的狀態head->next;
head->next;
始終指向上一個 \(q\)typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; void verge(linklist head) { linlist p, q; p = head->next; head->next = NULL; while (p) { q = p; p = p->next; q->next = head->next; // 經過 head->next 保留上一個 q 的狀態 head->next = q; } }
設計一個算法,將一個結點值天然數的單鏈表拆分爲兩個單鏈表,原表中保留值爲偶數的結點,而值爲奇數的結點按它們在原表中的相對次序組成一個新的單鏈表設計
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; linklist sprit(linklist head) { linklist L, pre, p, r; L = r = (linklist) malloc(sizeof(linknode)); r->next = NULL; pre = head; p = head->next; while (p) { if (p->data % 2 == 1) // 刪除奇數值結點,並用 L 鏈表保存 { pre->next = p->next; r->next = p; r = p; // 這樣使得 r 變成了 r->next p = pre->next; // 這樣使得 p 變成了 head->next->next } else // 保留偶數值結點 { pre = p; // 書中的貌似多餘操做 p = p->next; } } r->next = NULL; // 置返回的奇數鏈表結束標記 return L; }
設計一個算法,對一個有序的單鏈表,刪除全部值大於 x 而不大於 y 的結點指針
typedef struct node { int data; struct node *next; } linknode; typedef linknode *linklist; void deletedata(linklist head, datatype x, datatype y) { linklist pre = head, p, q; p = head->next; // 找第 1 處大於 x 的結點位置 while (p && p->data <= x) { pre = p; p = p->next; } // 找第 1 處小於 y 的位置 while (p && p->data <= y) p = p->next; // 刪除大於 x 而小於 y 的結點 q = pre->next; pre->next = p; // 小於 x 的第一個結點指向大於 y 的第一個結點 pre = q->next; // 釋放被刪除結點所佔用的空間 while (pre != p) { // 此時 p 已經指向了大於 y 的第一個結點 free(q); q = pre; pre = pre->next; } }
node *p = head; while (p && p->info != x) p = p->next; return p;