C语言单链表创建(基础)

最近在刷题重温C语言的基础知识。关于单链表的创建还有一些不懂,参考了网上的代码,做一下笔记。

1、单链表的创建与赋值

#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node* next;
};
int main()
{
	//创建一个单链表并输出数值
    struct node* head, * p, * q, * t;
    int i, n, a;
    scanf("%d", &n);
    head = NULL;
    for (i = 0; i < n; i++) {
        p = (struct node*)malloc(sizeof(struct node));
        scanf("%d", &a);
        p->data = a;
        p->next = NULL;
        if (head == NULL)
            head = p;
        else
            q->next = p;//这里的q相当于用于遍历链表的临时指针
        q = p;
    }
    //输出链表
    t = head;
    while (t != NULL) {
        printf("%d ", t->data);
        t = t->next;
    }
    return 0;
}

2、力扣第2题:两数相加官方代码及main函数测试代码-C语言

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

#include <stdio.h>
#include <stdlib.h>
struct ListNode {
    int val;
    struct ListNode* next;
};

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* head = NULL, * tail = NULL;
    int carry = 0;
    while (l1 || l2) {
        int n1 = l1 ? l1->val : 0;//条件判断语句,l1不为NULL时返回l1->val,l1为NULL时返回0
        int n2 = l2 ? l2->val : 0;
        int sum = n1 + n2 + carry;//carry为进位
        if (!head) {
            head = tail = malloc(sizeof(struct ListNode));
            tail->val = sum % 10;//求余
            tail->next = NULL;
        }
        else {
            tail->next = malloc(sizeof(struct ListNode));
            tail->next->val = sum % 10;
            tail = tail->next;
            tail->next = NULL;
        }
        carry = sum / 10;
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    if (carry > 0) {
        tail->next = malloc(sizeof(struct ListNode));
        tail->next->val = carry;
        tail->next->next = NULL;
    }
    return head;
}

void main() {
    struct ListNode* l1, * l2, * temp, * in, * out;
    int nums, val;
    //链表创建并赋值
    for (int i = 0; i < 2; i++) {
        printf("input nums of l%d\n", i+1);
        scanf("%d", &nums);
        if (i == 0) {
            l1 = NULL;
            for (int j = 0; j < nums; j++) {
                in = (struct ListNode*)malloc(sizeof(struct ListNode));
                scanf("%d", &val);
                in->val = val;
                in->next = NULL;//为输入的数值创建节点
                if (l1 == NULL) {
                    l1 = in;//l1为空的话让输入节点成为头节点
                }
                else {
                    temp->next = in;//将当前节点的next指针指向输入节点
                }
                temp = in;//让临时指针指向输入节点
            }
        }
        if (i == 1) {
            l2 = NULL;
            for (int j = 0; j < nums; j++) {
                in = (struct ListNode*)malloc(sizeof(struct ListNode));
                scanf("%d", &val);
                in->val = val;
                in->next = NULL;
                if (l2 == NULL) {
                    l2 = in;
                }
                else {
                    temp->next = in;
                }
                temp = in;
            }
        }
    }
    out = addTwoNumbers(l1, l2);
    //输出链表
    temp = out;
    while (temp != NULL) {
        printf("%d ", temp->val);
        temp = temp->next;
    }
}

https://blog.csdn.net/zhaozhiyuan111/article/details/102699398

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhengky6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值