链表的创建及遍历(C语言)

链表这个东西,很多时候会让我们很头疼,因为链表需要用到指针,而指针正是我们学习C语言遇到的最大困难之一,而链表又不得不用指针。

1.链表与数组的区别

  数组对于我们来说已经是非常熟悉的,而它与链表相似,有有很大的不同。

  首先数组是一个有序的元素序列,所有的元素都是依次按顺序排列,在内存中的地址也是依次排列,我们可以通过改变它的下标来访问其中的元素。

  而链表则不同,它在内存中并不是各个元素的地址按顺序排列,但我们却可以按照一定的顺序输出,这是因为每一个元素中通过指针来存储了下一个元素的地址,通过这个地址来访问下一个元素。

2.链表的创建

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

首先,我们需要创建一个结构体, 其中data是该节点的元素,而*next则是下一个节点的地址。

List createlist( int n)
{
    list head = NULL, t = NULL, p = NULL;
    for( int i = 0; i < n; i++)
    {
        t = (struct Node*)malloc( sizeof(struct Node) );
        t -> next = NULL;
        scanf("%d", &t -> data);
        if( p == NULL )
        {
            p = t;
            head = p;
        }
        else
        {
            p -> next = t;
            p = t;
        }
    }
    return head;
}

然后,我们先定义三个结构体指针并对它们进行初始化,分别是 head(头节点)、t (用来存储要插入元素的数据)、p(当前链表位置),但我们每一次要插入新节点的时候,我们需要用 malloc 函数为 t 申请一个空间来存储数据。然后进入 if-else 语句,将 t 插入到链表中,并且更新 p 到当前节点的位置。

3.链表的遍历

void print( list head)
{
    list t = head;
    while( t != NULL )
    {
        printf("%d ", t -> data);

        //每次打印完,就跳到下一个节点
        t = t -> next;
    }
    printf("\n");
}

 

4.综合代码

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

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

typedef struct Node* List;
List createlist( int n);
void print( List head);

int main()
{
    int n;
    printf("输入链表节点个数:\n");
    scanf("%d", &n);

    printf("\n输入链表节点:\n");
    List head = createlist(n);

    printf("\n输出的链表:\n");
    print(head);
    return 0;
}

// 创建链表
List createlist( int n)
{
    List head = NULL, t = NULL, p = NULL;
    for( int i = 0; i < n; i++)
    {
        t = (struct Node*)malloc( sizeof(struct Node) );
        t -> next = NULL;
        scanf("%d", &t -> data);
        if( p == NULL )
        {
            p = t;
            head = p;
        }
        else
        {
            p -> next = t;
            p = t;
        }
    }
    return head;
}

// 打印链表
void print( List head)
{
    List t = head;
    while( t != NULL )
    {
        printf("%d ", t -> data);

        //每次打印完,就跳到下一个节点
        t = t -> next;
    }
    printf("\n");
}

 好啦到这里就结束啦,希望我的代码对你有所帮助,以后我会继续更新有关链表的相关知识。如果有什么问题,或更好的方法,可以私信告诉我哦。 

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链表是一种常见的数据结构,它由一个个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表创建遍历可以使用C语言实现。 创建链表的步骤: 1. 定义链表节点的数据结构,包括数据元素和指向下一个节点的指针。 2. 定义头节点,并初始化为空。 3. 循环读入数据,创建新节点,将数据存储到新节点中,将新节点插入到链表的末尾。 4. 返回头节点。 下面是C语言实现的代码: ``` #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct ListNode { int data; // 数据元素 struct ListNode* next; // 下一个节点指针 } ListNode; // 创建链表函数 ListNode* createList() { ListNode* head = NULL; // 定义头节点并初始化为空 ListNode* tail = NULL; // 定义尾节点并初始化为空 int data; printf("请输入数据(输入-1结束):\n"); scanf("%d", &data); while (data != -1) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点 newNode->data = data; // 存储数据 newNode->next = NULL; // 新节点的下一个节点指针指向空 if (head == NULL) { // 如果头节点为空,说明链表还没有节点 head = newNode; // 将头节点指向新节点 tail = newNode; // 将尾节点也指向新节点 } else { tail->next = newNode; // 将新节点连接到链表末尾 tail = newNode; // 更新尾节点 } scanf("%d", &data); // 继续读入数据 } return head; // 返回头节点 } // 遍历链表函数 void traverseList(ListNode* head) { printf("链表数据:\n"); ListNode* p = head; // 定义指针p指向头节点 while (p != NULL) { // 循环遍历链表 printf("%d ", p->data); // 输出节点数据 p = p->next; // 将指针p指向下一个节点 } printf("\n"); } int main() { ListNode* head = createList(); // 创建链表 traverseList(head); // 遍历链表 return 0; } ``` 在上面的代码中,我们定义了链表节点结构体`ListNode`,包含数据元素`data`和指向下一个节点的指针`next`。在创建链表的函数`createList()`中,我们定义了头节点`head`和尾节点`tail`,并循环读入数据,创建新节点并将其插入到链表末尾。最后,我们返回头节点。在遍历链表的函数`traverseList()`中,我们定义了指针`p`指向头节点,循环遍历链表,输出节点数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值