出於很多剛學習鍊錶的很多小夥伴在學習鍊錶的時候有很多困惑,我在此特地的出一篇部落格,幫助我的朋友們。
(有寫的不好的地方,大佬請勿略這篇內容)
鍊錶裡面的插入資料還是很有講究的:
1)頭插法:插入資料
123
4567
89
實際輸出:
987
6543
21
2)尾插法:插入資料
123
4567
89
實際輸出:
123
4567
89
由此可以發現選擇插入資料的方法和實際需要的操作有選擇的必要性
下面我將給出操作鍊錶的函式**:
例如根據下面這個結構體建立的鍊錶:
struct stu
;typedef
struct stu stu;
/*自定義結構體的名稱,相當於把strcut stu替換成stu*/
頭插法:
stu*
creatlink()
return head;
}
尾插法:
stu*
creatlink()
return head;
}
刪除節點:
stu*
delnode
(stu* head,
int n)
if(head->num == n) head = head->next;
/*刪除頭節點的例子*/
return head;
}
增加節點:
stu*
addnode
(stu* head,
int n)
else p = s;
s = s->next;}if
(head->num == n)
return head;
}
明白以上模板,對於單鏈表的理解就差不多了!
鍊錶排序:
最簡單、直接的方式(直接採用冒泡或者選擇排序,而且不是交換結點,只交換資料域)
//線性表的排序,採用氣泡排序,直接遍歷鍊錶
void
listsort
(node*
& head)
l = l->next;}}
}
明白以上模板,對於單鏈表的理解就差不多了!
(通過例題來理解鍊錶編碼的格式與套路)
6-6 鍊錶拼接 (6分)
本題要求實現乙個合併兩個有序鍊錶的簡單函式。鍊錶結點定義如下:
struct listnode
;
函式介面定義:struct listnode *
mergelists
(struct listnode *list1,
struct listnode *list2)
;
其中list1和list2是使用者傳入的兩個按data公升序鏈結的鍊錶的頭指標;函式mergelists將兩個鍊錶合併成乙個按data公升序鏈結的鍊錶,並返回結果鍊錶的頭指標。
裁判測試程式樣例:
#include
#include
struct listnode
;struct listnode*
createlist()
;/*裁判實現,細節不表*/
struct listnode*
mergelists
(struct listnode* list1,
struct listnode* list2)
;void
printlist
(struct listnode* head)
printf
("\n");
}int
main()
/* 你的**將被嵌在這裡 */
輸入樣例:
135
7-12
46-1
輸出樣例:
123
4567
函式介面**:
struct listnode*
mergelists
(struct listnode* list1,
struct listnode* list2)
while
(p2)
for(
int i =
0; i < cnt -
1; i++)}
}struct listnode* head =
null
,* tail =
null
,* cur;
for(
int i =
0; i < cnt; i++
)return head;
}
上面這個題目又類似於剛學習字串時:兩個字串交叉合併的題目!
6-3 兩個字串穿插
本題要實現的程式功能是:①從鍵盤上先後讀入兩個字串,儲存在字元陣列str1和str2中。注意,這兩個字串最長均可達到32個字元、最短均可為0個字元。②將字串str2插入字串str1中。③在螢幕上輸出新生成的str1。
函式介面定義:
void
conj
(char
*s1,
char
*s2)
;
裁判測試程式樣例:
#include
#include
#define n 32
void
conj
(char
*s1,
char
*s2)
;int
main
(void
)/* 請在這裡填寫答案 */
輸入樣例:
123456789
abcdefghijklmn
輸出樣例:
1a2b3c4d5e6f7g8h9ijklmn
函式介面**:
void
conj
(char
* s1,
char
* s2)
while
(i < len1)
while
(j < len2)
*(s1 +0)
='\0'
;for
(int i =
0; i <
strlen
(s3)
; i++)*
(s1 + cnt)
='\0'
;}
鍊錶的原理都是建立在陣列的基礎上的!
唯一需要注意的是鍊錶位址不一定連續,而陣列連續。
需要大量刪除新增資料的時候鍊錶的作用就會無限放大,因為方便,時間複雜度很低。
陣列法不適合大量刪除資料和新增資料,需要通過迴圈移動資料位置。
然而陣列法適合大量修改資料,因為可以直接指令修改第n個資料,而鍊錶必須從頭節點開始到第n個資料的節點!
c語言之單鏈表簡單操作
建立鍊錶有倆種方式,一種是頭插法,一種是尾插法,倆種方法大同小異,在此我介紹尾插法。用圖示的方法很好理解。下面是用尾插法建立鍊錶的 struct student int n 記錄存放資料數目 struct student create p2 next null return head 建立過程結束 ...
用C語言簡單實現單鏈表
typedef struct node node,list 單鏈表的初始化 void initlist list plist plist next null 單鏈表的頭插法 該方法從乙個空鍊錶開始,讀取元素val,生成新的結點,將讀取的資料放到新結點的資料域中,然後將該新結點插入到當前鍊錶的表頭上。...
C語言單鏈表完整簡單示範
我們先實現乙個簡單的單鏈表的可新增資料和列印資料 include stdio.h include stdlib.h 提供malloc 和free include string.h 提供strcpy 等 struct node head null struct node end null struct...