C語言之實現單鏈表的基本操作

2021-10-19 23:02:35 字數 4031 閱讀 4860

目錄

1、鍊錶節點的定義

2、鍊錶基操function的宣告

3、鍊錶基操function的定義與實現

3.1 單鏈表的建立(頭插法)

3.2 單鏈表的建立(尾插法)

3.3 有序單鏈表的建立

3.4 單鏈表的遍歷 

3.5 在單鏈表中查詢元素

3.6 在單鏈表中的指定位置後插入元素

3.7  在單鏈表中刪除特定元素

3.8 兩個有序單鏈表合併的問題  總結

typedef int status;     //狀態碼資料型別

typedef int elemtype; //資料元素資料型別

typedef struct nodenode;

typedef struct node *linklist; //結構體鍊錶指標

單鏈表的基操function無非就是建立、刪除、插入、查詢、遍歷這幾個基本操作,這裡我就簡單的將建立、遍歷、插入、查詢這幾個function實現一下(我這裡都是帶「哨兵」的單鏈表哦!)

//建立單鏈表(頭插法)

void createlisthead(linklist *l, int n);

//建立單鏈表(尾插法)

void createlisttail(linklist *l, int n);

//插入節點

//刪除節點

//查詢特定節點

status find_list_node(linklist l, elemtype data);

//遍歷單鏈表

void displaylist(linklist l);

//建立特定有序鍊錶(頭插法)

void createorderlisth(linklist *l, int n, int array);

//建立特定有序鍊錶(尾插法)

void createorderlistt(linklist *l, int n, int array);

//合併兩個有序單鏈表

linklist mergetwolist(linklist l1, linklist l2);

這裡面我加入了面試中常考的乙個問題,就是「合併兩個有序單鏈表的操作」問題,在linklist  mergetwolist(linklist  l1,  linklist  l2)中有展示如何實現的!

首先我們來實現一下單鏈表的建立function,單鏈表的建立分為頭插法和尾插法這兩種(記住,我這裡可是帶頭結點的單鏈表哦!)。我們先說說頭插法吧!

頭插法呢!就是將乙個乙個節點插入到頭結點的後繼位置,也就是把每個新插入的節點放置在頭結點(哨兵節點)的後繼位置處!只要明白這一點,那實現起來,就和玩泥巴一樣,首先你需要建立乙個p結點,並且讓它的指標域指向null,(怕他搞事情,所以最好指向空)這個p節點就是乙個保姆,用來照顧我們新建的節點的資料和指標,我們為傳進來的頭結點分配記憶體空間,然後建立新節點,為其分配data(隨機數即可),並把p節點的next指標域指向頭結點的後繼即可(head->next);具體的**實現如下

//建立單鏈表(頭插法)

void createlisthead(linklist *l, int n)

}

咱們再來看看尾插法是怎麼操作的呢?尾插法啊!就是將新節點插入到單鏈表的尾巴處,那麼?我們如何得知**是單鏈表的尾巴處呢?這裡我們放置乙個「小兵」,這個小兵啥都不幹,就是幫咱們記錄「單鏈表的尾巴」在**,找到尾巴了,把新節點插入到尾巴後面,此時咱們的小兵指向的不在是單鏈表的尾巴了,我們需要讓小兵往後挪乙個節點(更新小兵的指向),這樣小兵又再次的指向單鏈表的尾巴了!依次反覆即可!當你插入完了以後,別忘了,讓你的小兵指向空哈(不然他要搞事情的啊!);具體的實現**如下哈!

//建立單鏈表(尾插法)

void createlisttail(linklist *l, int n)

r->next = null; //表示當前鍊錶結束

}

這個有序單鏈表的建立,我是用的順序儲存結構資料來儲存節點的資料的,我們只需要將上面的function修改一丟丟即可使用啊!也就是多加乙個陣列形參即可!具體的實現**如下:

//建立特定有序鍊錶(頭插法)

void createorderlisth(linklist *l, int n, int array)

}//建立特定有序鍊錶(尾插法)

void createorderlistt(linklist *l, int n, int array)

r->next = null;

}

單鏈表的遍歷還是蠻簡單的!你要是不會,99%是因為你沒有搞懂指標哦!那就好好看看指標再來看哈!**如下:

//遍歷單鏈表

void displaylist(linklist l)

printf("\n");

}

是不是so easy!呢?所以說,你要是看不懂,那就好好的敲敲腦袋瓜!面壁思過去(hhhhhh)

這個也比較簡單,菜哥就不講了!直接貼**!看不懂的都去給我面壁思過哈!

//查詢特定節點元素

status find_list_node(linklist l, elemtype data)

else

continue;

}p->next = null;

return j;

}

在單鏈表中的指定位置後面插入元素,這個操作不難,大概思路就是這樣的,遍歷鍊錶,搜尋到對應位置的節點,用個「保姆」指標存入插入的data,並將「保姆」指標的指標域存入特定位置節點後繼的位址,然後再將特定位置節點的指標域存入「保姆」指標的位址即可!具體操作**如下:

//在特定位置插入節點

void insertlistelem(linklist *l, int n, elemtype data)

me = (linklist)malloc(sizeof(node));

me->data = data;

me->next = pre->next;

pre->next = me;}}

在單鏈表中刪除特定元素,這個不難,大概思路就兩步,第一是在鍊錶中遍歷,找到特定元素對應的節點,二是把該節點從鍊錶中踢出去,並且要釋放該節點的記憶體空間(不然會出現記憶體溢位的問題哦!),好啦!廢話不多說,直接上**哈!

//在單鏈表中刪除指定元素

status deletelistelem(linklist *l, elemtype data)

else

}return error;

}

好好聽講哦!這個面試經常愛考的呦!大概的思路就是比較,往後挪,然後再比較,等誰先挪完了,基本上就可以結束了!(下面這個按照從小到大的順序哈)

如圖所示呢!l1,l2為兩個有序的單鏈表(帶頭結點哦!),l3呢是我們新建的乙個頭結點,用來連線合併後的結果,首先比較l1的第乙個節點的data與l2第乙個節點的data,若l1的小於l2的 ,則將l3的頭結點指向l1的第乙個節點,同時將l3往後挪乙個位置,然後再進行比較,比較到最後,誰先到結尾,那麼就直接將沒有到結尾的,把他後面的節點統統接到l3的尾巴後面即可!具體的操作**如下:

//合併兩個有序單鏈表

linklist mergetwolist(linklist l1, linklist l2)

else

prev = prev->next;

}// 合併後 l1 和 l2 最多只有乙個還未被合併完,我們直接將鍊錶末尾指向未合併完的鍊錶即可

prev->next = list1 == null ? list2 : list1;

return prehead->next;

}

完了,講完了,菜哥講學結束!

C語言之單鏈表實現

鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相比於線性表順序結構,操作複雜。由於...

c語言之單鏈表簡單操作

建立鍊錶有倆種方式,一種是頭插法,一種是尾插法,倆種方法大同小異,在此我介紹尾插法。用圖示的方法很好理解。下面是用尾插法建立鍊錶的 struct student int n 記錄存放資料數目 struct student create p2 next null return head 建立過程結束 ...

C語言之單鏈表操作之查詢

二 單鏈表的基本運算 建立了乙個單鏈表之後,如果要進行一些如插入 刪除等操作該怎麼辦?所以還須掌握一些單鏈表的基本演算法,來實現這些操作。單鏈表的基本運算包括 查詢 插入和刪除。下面我們就一一介紹這三種基本運算的演算法,並結合我們建立單鏈表的例子寫出相應的程式。1 查詢 對單鏈表進行查詢的思路為 對...