C語言之單向連結串列
1,單向鏈簡潔。
單向連結串列(單連結串列)是連結串列的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要透過順序讀取從頭部開始;連結串列是使用指標進行構造的列表;又稱為結點列表,因為連結串列是由一個個結點組裝起來的;其中每個結點都有指標成員變數指列表中的下一個結點;
列表是由結點構成,由head指標指向第一個成為表頭的結點而終止於最後一個指向nuLL的指標;
2,例子要求:
根據示例程式碼中的例子,完成單向連結串列(single linked list)中的以字串為資料的連結串列的插入、刪除以及查詢,並支援單向連結串列的反轉;
3,程式碼實現。
#include
#include
#include
#include
#include
//節點的定義
typedef struct Node {
void *data; //資料域 //鏈域
struct Node *next;
} NodeStruct, *pNode;
pNode head = NULL;
typedef char (*pCompareFunc)(void *a, void *b);
typedef void* (*pChar)(void *p);
// 字串判斷
int str_compare(void *a, void *b) {
char *pa = (char*)a;
char *pb = (char*)b;
return strcmp(pa , pb);
}
// 分配一個節點
pNode allocate_node(void *data, pChar char_func) {
pNode node = allocate();
node->data = char_func(data);
return node;
}
// 建立節點
pNode allocate() {
void *p = malloc(sizeof(NodeStruct));
pNode node = (pNode)p;
node->next = NULL;
node->data = NULL;
return node;
}
// 新增一個節點
void insertNode(pNode node){
if (head == null){
head=node;
}
else {
node->next = head;
head = node;
}
}
void* char_char(void *p) {
char* pa = (char*)malloc(sizeof(char));
memcpy(pa, p, sizeof(char));
return pa;
}
// 初始化節點
pNode allocate_node(void *data, pChar char_func) {
pNode node = allocate();
node->data = char_func(data);
return node;
}
// 釋放資源
void free_list(pNode node) {
pNode next = node;
while (next != NULL) {
if (next->data != NULL)
free(next->data);
pNode temp = next;
next = next->next;
free(temp);
}
}
// 1.1 新增一個節點
void insert(pNode node) {
if (head == NULL)
head = node;
else {
node->next = head;
head = node;
}
}
//1.2查詢
int str_search(void* data,pCompareFunc compare){
pNode next = head;
pNode prev = NULL;
while (next != NULL ) {
if (compare(data, next->data) == 0) {
// 如果查詢到了,就退出返回1
return 1;
break;
}
prev = next;
next = next->next;
}
// 如果一直查詢不到,就返回0
return 0;
}
// 1.3刪除節點
void remove(void* data,pCompareFunc compare) {
pNode next = head;
pNode prev = NULL;
while (next != NULL) {
if (compare(data, next->data) == 0) {
if (prev == NULL) {
head = next->next;
next->next = NULL;
free_list(next);
} else {
prev->next = next->next;
next->next = NULL;
free_list(next);
}
break;
}
prev = next;
next = next->next;
}
}
//1.4反轉
void invert_order()
{
node *This,*prev;
p=head.next;
This=NULL;
while(p) {
prev=This;
This=p;
p=p->next;
This->next=prev;
}
head.next=This;
}
void main(){
// 1單向連結串列
char a1[] = 'aaa1';
char a2[] = 'aaa2';
char a3[] = 'aaa3';
// 1.1新增
insertNode(allocate_node(a1, init_char));
insertNode(allocate_node(a2, init_char));
insertNode(allocate_node(a3, init_char));
// 1.2查詢
int flag = 0;
flag = str_search(&a2,str_compare);
// 1.3刪除
remove(&a2,str_compare);
// 1.4反轉
invert_order();
}
----------------------------------------------------------------------------------------------------------------
有,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!>
原部落格地址: http://blog.itpub.net/26230597/viewspace-1386593/
原作者:黃杉 (mchdba)
----------------------------------------------------------------------------------------------------------------
單向連結串列(單連結串列)是連結串列的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要透過順序讀取從頭部開始;連結串列是使用指標進行構造的列表;又稱為結點列表,因為連結串列是由一個個結點組裝起來的;其中每個結點都有指標成員變數指列表中的下一個結點;
列表是由結點構成,由head指標指向第一個成為表頭的結點而終止於最後一個指向nuLL的指標;
2,例子要求:
根據示例程式碼中的例子,完成單向連結串列(single linked list)中的以字串為資料的連結串列的插入、刪除以及查詢,並支援單向連結串列的反轉;
3,程式碼實現。
#include
#include
#include
#include
#include
//節點的定義
typedef struct Node {
void *data; //資料域 //鏈域
struct Node *next;
} NodeStruct, *pNode;
pNode head = NULL;
typedef char (*pCompareFunc)(void *a, void *b);
typedef void* (*pChar)(void *p);
// 字串判斷
int str_compare(void *a, void *b) {
char *pa = (char*)a;
char *pb = (char*)b;
return strcmp(pa , pb);
}
// 分配一個節點
pNode allocate_node(void *data, pChar char_func) {
pNode node = allocate();
node->data = char_func(data);
return node;
}
// 建立節點
pNode allocate() {
void *p = malloc(sizeof(NodeStruct));
pNode node = (pNode)p;
node->next = NULL;
node->data = NULL;
return node;
}
// 新增一個節點
void insertNode(pNode node){
if (head == null){
head=node;
}
else {
node->next = head;
head = node;
}
}
void* char_char(void *p) {
char* pa = (char*)malloc(sizeof(char));
memcpy(pa, p, sizeof(char));
return pa;
}
// 初始化節點
pNode allocate_node(void *data, pChar char_func) {
pNode node = allocate();
node->data = char_func(data);
return node;
}
// 釋放資源
void free_list(pNode node) {
pNode next = node;
while (next != NULL) {
if (next->data != NULL)
free(next->data);
pNode temp = next;
next = next->next;
free(temp);
}
}
// 1.1 新增一個節點
void insert(pNode node) {
if (head == NULL)
head = node;
else {
node->next = head;
head = node;
}
}
//1.2查詢
int str_search(void* data,pCompareFunc compare){
pNode next = head;
pNode prev = NULL;
while (next != NULL ) {
if (compare(data, next->data) == 0) {
// 如果查詢到了,就退出返回1
return 1;
break;
}
prev = next;
next = next->next;
}
// 如果一直查詢不到,就返回0
return 0;
}
// 1.3刪除節點
void remove(void* data,pCompareFunc compare) {
pNode next = head;
pNode prev = NULL;
while (next != NULL) {
if (compare(data, next->data) == 0) {
if (prev == NULL) {
head = next->next;
next->next = NULL;
free_list(next);
} else {
prev->next = next->next;
next->next = NULL;
free_list(next);
}
break;
}
prev = next;
next = next->next;
}
}
//1.4反轉
void invert_order()
{
node *This,*prev;
p=head.next;
This=NULL;
while(p) {
prev=This;
This=p;
p=p->next;
This->next=prev;
}
head.next=This;
}
void main(){
// 1單向連結串列
char a1[] = 'aaa1';
char a2[] = 'aaa2';
char a3[] = 'aaa3';
// 1.1新增
insertNode(allocate_node(a1, init_char));
insertNode(allocate_node(a2, init_char));
insertNode(allocate_node(a3, init_char));
// 1.2查詢
int flag = 0;
flag = str_search(&a2,str_compare);
// 1.3刪除
remove(&a2,str_compare);
// 1.4反轉
invert_order();
}
----------------------------------------------------------------------------------------------------------------
有,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!>
原部落格地址: http://blog.itpub.net/26230597/viewspace-1386593/
原作者:黃杉 (mchdba)
----------------------------------------------------------------------------------------------------------------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26230597/viewspace-1386593/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 連結串列 - 單向連結串列
- C語言單向連結串列的增刪操作C語言
- 單向迴圈連結串列介面設計(C語言)C語言
- c語言單向連結串列逆轉實現方法C語言
- c/c++ 線性表之單向連結串列C++
- 棧_單向連結串列
- 12.19單向連結串列
- 雙向連結串列介面設計(C語言)C語言
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 簡單的單向連結串列
- C語言資料結構:單向迴圈連結串列的增刪操作C語言資料結構
- 佇列_單向連結串列佇列
- 單向迴圈連結串列
- 10單向連結串列(slist)
- 單向連結串列的建立
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- c/c++ 線性表之單向迴圈連結串列C++
- 連結串列-雙向連結串列
- 單向連結串列————遍歷、查詢、插入結點 (基於C語言實現)C語言
- 詳解雙向連結串列的基本操作(C語言)C語言
- 單向連結串列介面設計
- go 實現單向連結串列Go
- 連結串列-雙向通用連結串列
- 【c# .net】雙向連結串列( LinkedList )C#
- C語言資料結構:雙向連結串列的增刪操作C語言資料結構
- 連結串列-雙向非通用連結串列
- 用c語言實現資料結構——單連結串列C語言資料結構
- 資料結構——單連結串列介面實現(C語言)資料結構C語言
- 單向迴圈連結串列大綱
- C語言線性連結串列C語言
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- 雙向連結串列
- Python實現單向連結串列詳解Python
- 單向迴圈連結串列的介面程式
- 單向迴圈連結串列的實現
- C語言之結構體C語言結構體