最近在刷题重温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