天天看點

怎樣用C語言建立單向連結清單? 并且實作連結清單的插入與删除

作者:煩人的星辰

#暑期創作大賽#

用C語言建立單向連結清單,并且實作連結清單的插入與删除

#include <stdio.h>
#include <stdlib.h>

struct LinkNode
{
    int data;
    struct LinkNode *next;
}; 
typedef struct LinkNode *Lnode;

struct LinkList
{
    Lnode pHeader;  //頭節點
    int m_Size;  //長度
};
typedef struct LinkList *Llist;

// 初始化連結清單
Llist init_list()
{
    Llist l1 = malloc(sizeof(struct LinkList));    
    if (l1 == NULL)
        printf("記憶體配置設定失敗");
    l1->pHeader = malloc(sizeof(struct LinkNode));
    l1->pHeader->data = 0;
    l1->pHeader->next = NULL;
    l1->m_Size = 0;

    return l1;
}

// 插入元素
void insert(Llist list, int p, int data)
{
    int i = 0;
    if((p < 0) || (p > list->m_Size))
        p = list->m_Size;

    Lnode q = list->pHeader;
    for (i = 0; i < p; ++i)
    {
        q = q->next;
    }

    Lnode new_node = malloc(sizeof(struct LinkNode));
    if(new_node == NULL)
        printf("記憶體配置設定失敗");
    new_node->next = q->next;
    new_node->data = data;
    q->next = new_node;
    list->m_Size++;
} 

// 周遊連結清單
void travel(Llist list)
{
    Lnode q = list->pHeader;
    printf("連結清單内容為: ");
    while(q->next != NULL)
    {        
        q = q->next;
        printf("%d ", q->data);
    }
    printf("\n");
}

// 删除元素
void delete(Llist list, int p)
{
    int i = 0;
    if((p < 0) || (p >= list->m_Size))
    {
        printf("節點%d不存在\n", p);
        return;
    }
    Lnode q = list->pHeader;
    for (i = 0; i < (p-1); ++i)
    {    
        q = q->next;    
    }
    Lnode qDel = q->next;
    q->next = qDel->next;
    free(qDel);
    qDel = NULL;
    list->m_Size -= 1;
}

// 清空連結清單
void clear(Llist list)
{
    int i = 0;
    Lnode q = list->pHeader->next;
    for (i = 0; i < list->m_Size; ++i)
    {
        Lnode p = q->next;
        free(q);
        q = p;
    }
    list->pHeader->next = NULL;
    list->m_Size = 0;
}

int main(int argc, char const *argv[])
{
    Llist L;
    L = init_list();
    printf("連結清單頭位址為%p\n", L);    
    // 插入元素
    insert(L, 0, 35);
    insert(L, 1, 0);
    insert(L, 2 , 9);
    insert(L, 3, 13);
    travel(L);
    // 删除元素
    delete(L, 2);
    delete(L, 15);
    travel(L);
    // 清空連結清單
    clear(L);
    travel(L);    

    return 0;
}           

繼續閱讀