链表这个东西,很多时候会让我们很头疼,因为链表需要用到指针,而指针正是我们学习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");
}
好啦到这里就结束啦,希望我的代码对你有所帮助,以后我会继续更新有关链表的相关知识。如果有什么问题,或更好的方法,可以私信告诉我哦。