C語言之單向連結串列

mchdba發表於2014-12-31
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)
----------------------------------------------------------------------------------------------------------------


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26230597/viewspace-1386593/,如需轉載,請註明出處,否則將追究法律責任。

相關文章