有序鏈表合並C語言遞歸版--我稍微會一點編程
阿新 • • 發佈:2019-02-17
條件 char return argv 語句 calloc stdlib.h art clas
假期最後一天,閑著沒事編個程,天天吆喝自己不會編程,其實還是稍微會一點的。
??以下是一個有序鏈表合並的代碼,一刻鐘內盲寫,花了10分鐘左右調試通過,通篇只有一個if語句作為遞歸退出條件!
#include <stdio.h>
#include <stdlib.h>
int a[] = {1,3,5,7,8,10,11,12,15,19,21,22,24,25,26};
int b[] = {2,4,5,6,9,16,17,18,27,30,31};
struct list {
struct list *next;
int v;
};
void merge(struct list *iter, struct list *base)
{
struct list *last = iter;
if (!iter) {
return;
}
iter = iter->next;
while (iter && (!base || iter->v < base->v)) {
last = iter;
iter = iter->next;
}
last->next = base;
merge(base, iter);
}
int main(int argc, char **argv)
{
int i = 0, j = 0;
struct list *al = (struct list*)calloc(15, sizeof(*al));
struct list *bl = (struct list*)calloc(11, sizeof(*bl));
struct list *itera;
struct list *iterb;
// create 2 lists
{
for (i = 0 ; i < 15; i++) {
itera = &al[i];
itera->v = a[i];
itera->next = &al[i+1];
}
itera->next = NULL;
for (i = 0; i < 11; i++) {
iterb = &bl[i];
iterb->v = b[i];
iterb->next = &bl[i+1];
}
iterb->next = NULL;
}
// merge 2 lists
{
merge(al, bl);
}
// print the result
{
for (; al; al=al->next) {
printf("%d \n", al->v);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
本來想為這種行為找點意義,因為這實在是太簡單了(簡單並不意味著每個人都能寫對,我就總是搞不定邊界判斷),我有時間不去搞TCP不去搞SDWAN,弄這幹什麽?
??主要是假期的旅行泡湯了,本來是想外出的,然而沒有成行,就在家裏待了三天。
??啊哈,可以教小小啊!可以教小小怎麽把兩個有序的鏈表合並成一個。當我做完這個程序後,搜了一下網上別人寫的方案,發現還是我的最簡單了,我也不考慮什麽時間復雜度了,總之能讓一個六歲的智商平平的小孩子用最短時間理解這段代碼才是根本目的,於是也就不炫技了。
??竹杖芒鞋輕勝馬,誰怕?一蓑煙雨任平生!然而,何來煙雨?何謂平生?
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
有序鏈表合並C語言遞歸版--我稍微會一點編程