單鏈表的實現

2021-06-22 16:59:28 字數 3734 閱讀 7024

單鏈表是資料結構中重要並且基礎的一環,學習資料結構就需要知道單鏈表有的常用操作。

1> 單鏈表的頭插式建立

2> 單鏈表的尾插式建立

3>單鏈表的長度計算

4>單鏈表的列印輸出

5> 單鏈表的釋放操作

6>單鏈表是否為空判斷

7>單鏈表在指定index插入指定元素

8>單鏈表刪除指定index的節點

9>單鏈表的逆置

10>兩個有序單鏈表的合併成乙個鍊錶 不申請額外空間

11>單鏈表是否有環判斷

/*

linklist.h

*/#include typedef int datatype;

typedef struct node

; typedef node* linklist;

linklist headcreatelinklist() // 頭插式建立帶頭鍊錶

int tmp;

head->next = null;

std::cout << "input list elems and -1 end !" << std::endl;

while( std::cin >> tmp )

node->data = tmp;

node->next = head->next;

head->next = node;

}return head;

} linklist tailcreatelinklist() // 尾插式建立帶頭鍊錶

curnode = head;

int tmp;

std::cout << "input list elems and -1 over!" << std::endl;

while(std::cin >> tmp)

sptr->data = tmp;

curnode->next = sptr;

curnode =sptr;

}curnode->next = null;

return head;

} int linklistlength(linklist list) // 計算鍊錶長度 不包括頭結點

return len;

} void printlinklist(linklist list) // 帶頭節點鍊錶列印

std::cout << " ]" << std::endl;

} void destorylinklist(linklist list) // 釋放帶頭鍊錶

std::cout << "linklist is destory ~" << std::endl;

} int empty(linklist list) // 判斷鍊錶是否為空

int insertnode(linklist list, int elem , int index) // 在index節點之前插入節點值為elem的節點 按照index

node* cur = list;

for ( int i = 1; i < index; i++) // 找到第index節點的前驅節點

node* node = (node*) malloc( sizeof(node));

if (!node)

node->data = elem;

node->next = cur->next;

cur->next = node;

return 1;

}int deletenode(linklist list, int index) // 按照對應的鍊錶索引進行刪除

node* cur = list;

for ( int i = 1; i < index; i++) // 找到index節點的前驅節點

node* tmp = cur->next;

cur->next = cur->next->next;

free(tmp);

return 1;

}void reverselinklist(linklist list) // 單鏈表逆置

}linklist mergelinklist(linklist lista, linklist listb) // 合併兩個非公升序鍊錶到乙個鍊錶 不申請額外空間

else if (pa->data > pb->data)

else

pc = pc->next;

} if(pa) pc->next = pa;

if(pb) pc->next = pb;

std::cout << "free node :" << x << std::endl;

return listc;

}int existlooplinklist(linklist list) // 判斷單鏈表是否存在環

return 0;}/*

main.cpp

*/#include "linklist.h"

int main()

p->next = cur;

if (existlooplinklist(list))

std::cout << "list exist loop ~~~" << std::endl;

else

std::cout << "list not exist loop ~~~" << std::endl;

destorylinklist(list);

// test merge 2 linklist

linklist lista = tailcreatelinklist();

printlinklist(lista);

linklist listb = tailcreatelinklist();

printlinklist(listb);

std::cout << "merge lista and listb " ;

linklist listc = mergelinklist(lista, listb);

if (null != listc)

destorylinklist(listc);

// test reverse linklist

linklist taillist = tailcreatelinklist();

printlinklist(taillist);

std::cout << "taillist length is :" << linklistlength(taillist) << std::endl;

std::cout << "taillist after reverse:" ;

reverselinklist(taillist);

printlinklist(taillist);

// test insert and delete elems

std::cout << "input insert elem and index " << std::endl;

int elem, index;

std::cin >> elem >> index;

if (insertnode(taillist, elem, index))

std::cout << "input delete index " << std::endl;

std::cin >> index;

if (deletenode(taillist, index))

destorylinklist(taillist);

return 0;

}

單鏈表的實現

include includetypedef struct node 定義鍊錶 snode snode creat 建立鍊錶的函式 q next null return head int length snode head 測鍊錶的結點數 return i void display snode he...

單鏈表的實現

單鏈表夜市線性表的一種表現形式,乙個表節點由乙個資料空間和乙個指標域組成。指標域記錄下乙個結點的位址。鍊錶在插入,刪除功能中效率高。但是讀取某個結點的時候需要順序讀取。效率不如順序儲存形式。下面是一些鍊錶實現的 鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h define...

單鏈表的實現

純粹看了書之後自己想著打的,所以可能有藏著一些bug沒有發現,看看以後能不能找到。上 include include include using namespace std typedef struct link linklist 基本鍊錶結構 void inputdata linklist hea...