C语言丨链表

知识点

1、结构体的嵌套:

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

NODE这个结构体中第一个变量是数据;第二个变量是一个指向与它自己相同类型的变量的指针,故变量类型也是struct NODE.

2、typedef

typedef是一种用来为数据类型定义新的名称的关键字。通过使用typedef,可以为现有的数据类型(如int、char、struct等)定义一个新的别名,使得代码更易读和理解:

①为基本数据类型创建别名:

typedef int integer;
integer num = 10;

②为结构体创建别名:

typedef struct 
{
    int age;
    char name[20];
} Person;

Person p1;
p1.age = 25;
strcpy(p1.name, "John");

③为函数指针创建别名:

typedef void (*func_ptr)(int);
/*定义新的类型func_ptr,它是指向参数为int,返回类型为void的函数的指针*/

void print_number(int num) 
{
    printf("Number: %d\n", num);
}
/*print_number函数,接受num并打印*/

func_ptr ptr = &print_number;
/*声明了一个名为ptr的变量,类型为func_ptr;
并将ptr指向了print_number这个函数*/

ptr(5);
/*将5作为参数传给ptr。实际上调用了print_number(5)*/

程序设计

例:读取一串整数,输入到链表中,直到输入的数为-1停止

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

typedef struct _node
{
	int value;
	struct _node* next;
}Node;

int main()
{
	int number;
	Node* head = NULL;
	Node* p=(Node*)malloc(sizeof(Node));

	do
	{
		scanf("%d", &number);
		if (number != -1)
		{
			p->value = number;
			p->next = NULL;
		}

		if (head == NULL)
			head = p;
		else
		{
			if (head->next != NULL)
				head = head->next;
			head->next = p;
		}
	}while (number != -1);

	return 0;
}

如果将读数的操作包装成一个函数,并将链表中的数打印出来:

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

typedef struct _node
{
	int value;
	struct _node* next;
}Node;

Node* AddToLinkedList(Node* head,int number);

int main()
{
	int number;
	Node* head = NULL;
	Node* current = NULL;

	do
	{
		scanf("%d", &number);
		if (number != -1)
		{
			head = AddToLinkedList(head, number);
		}
	} while (number != -1);
	current = head;

	while (current!= NULL)
	{
		printf("%d ", current->value);
		current = current->next;
	}

	return 0;
}

Node* AddToLinkedList(Node* head,int number)
{
	Node* p = (Node*)malloc(sizeof(Node));
	Node* lastNode = head;
	p->value = number;
	p->next = NULL;

	if (head == NULL)
	{
		head = p;
	}
	else
	{
		while(lastNode->next != NULL)
		{
			lastNode = lastNode->next;
		}
		lastNode->next = p;
	}
	return head;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值