欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言指针应用(四)-- 链表

程序员文章站 2024-03-07 15:54:27
...

对于一个职业的C语言程序员,熟练的使用链表是基础。链表在编程实践中应用广泛,也是实现各种数据结构的基础。所以这篇博文以后的几篇博文都会讲述链表以及应用链表实现各种数据结构。如果读者能够认真阅读和实践我的文章一定会对链表和C语言指针有新的认识。
1.单向链表
类似于下图的数据存储方式就是数据结构中的单向链表:
C语言指针应用(四)-- 链表
参照图片,我们定义一个数据节点的数据结构:

typedef struct node
{
	void *data;
	struct node *next;
}Node;

看完我定义的链表节点,读者可能发现我们的数据项居然是一个空指针。在我以后的程序代码中读者会经常看到空指针的出现。

如果有读者已经了解了空指针的用法可以跳过这一段文字。我们都知道C语言是系统语言,它为程序员提供了全部的*。空指针就是C语言中*的小鸟,它可以指向任意的数据类型。灵活的应用空指针我们可以实现泛型编程的效果。当然,C语言不支持泛型编程。
在接下来的代码中读者可以看到空指针的神奇之处,下面让我实现在单向链表。

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

typedef struct node
{
    int data;
    struct node *next;
}Node;

typedef Node* Head;

Head list_append(Node* head, int data)
{
    Node *p;
    Node *node = (Node *)malloc(sizeof (Node *));
    if(head != NULL)
    {
        if(node != NULL)
        {
            node->data = data;
            node->next = NULL;
            p = head;
            while (p->next !=NULL) {
                p = p->next;
            }
            p->next = node;
        }
    }
    else {
        head = (Head)malloc(sizeof (Head));
        if(head != NULL)
        {
            head->data = data;
            head->next = NULL;
        }
    }
    return head;
}

int main()
{
    int i;
    Head head = NULL;
    Node *node = NULL;

    for (i= 0; i < 10; i++) {
        head = list_append(head, i);
    }

    node = head;
    while (node->next != NULL) {
        printf("%d\n", node->data);
        node = node->next;
    }
}

就这样一个简单的链表就实现了,今天没有实现空指针的链表,调试出了点问题,我会继续努力的,就先实现一个int的链表作为示例。当然上面的程序不是最终的版本,我会进一步的将他改进,感兴趣的读者可以持续关注我。

相关标签: 原创