头节点单链表

博客内容直接给出代码,但未提供更多信息。

直接上代码

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

typedef struct list{
    int num;
    struct list *next;
}list_t;


//链表头初始化
list_t *list_init()
{
    list_t *head = (list_t *)malloc(sizeof(list_t));
    if(head == NULL)
        return NULL;
    
    head->num = 0;
    head->next = NULL;

    return head;
}


//尾部追加
void append_tail(list_t *h,int num)
{
    list_t *one = (list_t *)malloc(sizeof(list_t));
    if(one == NULL)
        return;
    
    one->num = num;
    one->next = NULL;

#if 1
    list_t *end;
    end = h;
    while(end->next != NULL)
        end = end->next;
    
    end->next = one;
#else
    //二级指针尾部追加
    list_t **link;
    link = &h->next;
    while(*link)
        link = &(*link)->next;
    
    *link = one;
#endif
}


//头部追加
void append_top(list_t *h,int num)
{
    list_t *one = (list_t *)malloc(sizeof(list_t));
    if(one == NULL)
        return;
    
    one->num = num;
    
    //以下两行不可调换,防止无节点时产生错误
    one->next = h->next;
    h->next = one;
}


//遍历链表
void trave_list(list_t *h)
{
    list_t *i;
    
    for(i=h->next;i!=NULL;i=i->next)
        printf("%x ",i->num);
    
    printf("\n");
}


//删除链表
void delete_list(list_t *h)
{
#if 0
    list_t *i;
    list_t *j;

    for(i=h->next;i!=NULL;i=j)
    {
        j = i->next;
        h->next = i->next;
        free(i);
    }
#else
    //二级指针删除链表
    list_t *entry;
    list_t **link = &h->next;
    while(*link)
    {
        entry = *link;
        #if 0
        //删除所有节点
        *link = entry->next;    //将头节点指向<删除节点>的后一个节点
        free(entry);
        #else
        //一个节点不删除
        link = &entry->next;
        #endif
    }
#endif
}


int main()
{
    int num = 0;
    list_t *head = list_init();

    while(1)
    {
        scanf("%d",&num);
        if(num == -1)
            break;
        
        append_tail(head,num);
    }

    trave_list(head);

    delete_list(head);

    trave_list(head);

    return 0;
}

### 单链表概述 链表是一种常见的数据结构,与数组不同,数组存放数据时必须提前指定数组长度,若要保存的元素数量大于数组大小,则无法将所有内容保存;若远小于数组大小,又会造成空间浪费。而链表的存储元素个数不受限定,添加元素时,存储个数随之增加。链表是一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,每个存储单元称为一个节点[^2]。 ### 带头节点单链表的优势 在实际使用中,带头结点的单链表比不带头结点的单链表使用更为广泛和方便。因为带头节点单链表不用单独考虑第一个节点的情况,第一个节点和其他后续节点的处理方式相同,简化了操作[^1]。 ### 带头节点单链表的节点定义 在C语言中,可使用结构体来定义单链表的节点,示例代码如下: ```c typedef int DataType; typedef struct LinkNode { DataType _data; // 当前节点保存数据 struct LinkNode* _pNext; // 指向链表中下一结点的指针 } Node; ``` 在上述代码中,`DataType` 表示节点中存储的数据类型,这里以 `int` 为例。`_data` 用于存储当前节点的数据,`_pNext` 是一个指向下一个节点的指针。 ### 带头节点单链表的基本操作 以下列举一些带头节点单链表常见的基本操作及其实现思路: - **初始化**:创建一个头节点,并将其 `_pNext` 指针置为 `NULL`。 ```c Node* InitList() { Node* head = (Node*)malloc(sizeof(Node)); if (head == NULL) { printf("内存分配失败\n"); return NULL; } head->_pNext = NULL; return head; } ``` - **创建链表**:可以通过不断插入新节点来创建链表。例如,在链表尾部插入新节点。 ```c void InsertTail(Node* head, DataType data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { printf("内存分配失败\n"); return; } newNode->_data = data; newNode->_pNext = NULL; Node* p = head; while (p->_pNext != NULL) { p = p->_pNext; } p->_pNext = newNode; } ``` - **计算链表长度**:遍历链表,统计节点的数量。 ```c int ListLength(Node* head) { int length = 0; Node* p = head->_pNext; while (p != NULL) { length++; p = p->_pNext; } return length; } ``` - **清空链表**:释放链表中所有节点的内存。 ```c void ClearList(Node* head) { Node* p = head->_pNext; while (p != NULL) { Node* temp = p; p = p->_pNext; free(temp); } head->_pNext = NULL; } ``` ### 代码仓库 上述带头节点单链表基本操作的完整代码可在 [https://github.com/chenyufeng1991/LinkedList_HeadNode](https://github.com/chenyufeng1991/LinkedList_HeadNode) 查看 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值