單向有頭不迴圈鍊錶

2021-08-28 08:46:58 字數 3130 閱讀 4003

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

給出標頭檔案:

#ifndef __slist_h__

#define __slist_h__

#include #include #include typedef int datatype;

typedef struct node

node; //節點的結構體

//列印

void slistprint(node *pfirst);

// 初始化

void slistinit(node **ppfirst);

// 尾部插入

void slistpushback(node** ppfirst, datatype data);

// 頭部插入

void slistpushfront(node **ppfirst, datatype data);

// 尾部刪除

void slistpopback(node **ppfirst);

// 頭部刪除

void slistpopfront(node **ppfirst);

// 給定結點插入,插入到結點前

void slistinsert(node **ppfirst, node *pos, datatype data);

// 給定結點刪除

void slisterase(node **ppfirst, node *pos);

// 按值刪除,只刪遇到的第乙個

void slistremove(node **ppfirst, datatype data);

// 按值刪除,刪除所有的

void slistremoveall(node **ppfirst, datatype data);

// 銷毀

void slistdestroy(node **ppfirst);

// 按值查詢,返回第乙個找到的結點指標,如果沒找到,返回 null

int slistfind(node *pfirst, datatype data);

#endif __slist_h__

接下來就實現如上功能

#include "slist.h"

void slistinit(node **ppfirst)

void slistprint(node *pfirst)

printf("null\n");

}node* newnode(datatype data)

//尾插

void slistpushback(node** ppfirst, datatype data)

// 找鍊錶中的最後乙個結點 (鍊錶中至少有乙個結點)

node *cur = *ppfirst;

while (cur->next != null)

cur->next = node;

}//頭插

void slistpushfront(node **ppfirst, datatype data)

//尾刪

void slistpopback(node **ppfirst)

// 鍊錶中至少有兩個結點,才能找倒數第二個

node *cur = *ppfirst;

while (cur->next->next != null)

free(cur->next);

cur->next = null;

}//頭刪

void slistpopfront(node **ppfirst)

// 給定結點插入,插入到結點前

void slistinsert(node **ppfirst, node *pos, datatype data)

node *newnode = newnode(data); // *** 不要忘了申請空間

node *cur;

// 找到 pos 前的乙個結點

for (cur = *ppfirst; cur->next != pos; cur = cur->next) {}

// 改變的是字段內的值,而不是指標的值

cur->next = newnode;

newnode->next = pos;

}// 給定結點刪除 (pos一定在鍊錶中)

void slisterase(node **ppfirst, node *pos)

node *cur = *ppfirst;

while (cur->next != pos)

cur->next = pos->next;

free(pos); // 不要忘記釋放結點

}// 按值刪除,只刪遇到的第乙個

void slistremove(node **ppfirst, datatype data)

else

cur = node->next;

node->next = cur->next;

free(cur); }}

// 按值刪除,刪除所有的

void slistremoveall(node **ppfirst, datatype data)

else

else}}

}// 銷毀

void slistdestroy(node **ppfirst)

}// 按值查詢,返回第乙個找到的結點指標,如果沒找到,返回 null

int slistfind(node *pfirst, datatype data)

} return null;

}

程式測試及結果如下:

鍊錶之單向有頭不迴圈鍊錶

typedef struct listnode listnode 下面就是一些構造鍊錶的一些 函式,包括刪除,插入,銷毀等 建立乙個節點 listnode buynode typedate x 頭插 就是從頭節點處 插入乙個節點 void slistpushfront listnode pphead...

單向不迴圈鍊錶

linkedlist主要類 class linkednode public class linkedlist node.next head this.head node return 尾插 public void addlast int elem linkednode cur this.head 迴...

無頭單向不迴圈鍊錶和帶頭雙向迴圈鍊錶

無頭單向不迴圈鍊錶 include include slist.h typedef int sltdatetype typedef struct slistnode slistnode 動態申請乙個節點 slistnode buyslistnode sltdatetype x 單鏈表列印 void ...