链表是基于将多个结构体连接在一起,可以使用一个指向链表的指针访问链表中存储的信息。
每一个方块代表了一个结构体,比如我们可以这样来定义一个结构体:
struct node{
int val;
struct node*next;
};
该结构体可以储存一个int量,还有一个指向该类型结构体的指针。
我们可以在具体的程序中看看链表是如何实现的:
#include <stdio.h>
#include<stdlib.h> //提供malloc函数;
#include<string.h> //提供字符串函数strcpy
typedef struct film { //typedef让struct film可以用Film代替。
char title[20];
struct film* next;
}Film;
int main() {
Film* head = NULL;//创造出一个头指针,指向链表的第一项
Film* current = NULL;//current指针是为了方便对链表进行操作
Film* tail = NULL;//tail指针始终指向链表的最后一个元素可以对链表加项
char input[20];
puts("enter the first movie title");
while (fgets(input, 20, stdin) != NULL && input[0] != '!') {
current = (Film*)malloc(sizeof(Film));
strcpy(current->title, input);
if (head == NULL) { /*如果head指针是NULL的那证明还没有项加入链表中,那就让head指向第一项*/
head = current;
}
else {
tail->next = current; //将current接到链表的尾部
}
current->next = NULL;
tail = current;//让tail指针重新指向最后一项
puts("enter the next movie title or input ! to stop");
}
current = head; //让current指向第一个元素,打印每个结构体含有的title
while (current != NULL) {
printf("%s", current->title);
current = current->next;
}
//释放空间
current = head;
while (current != NULL) {
head = current->next;
free(current);
current = head;
}
puts("finished!");
return 0;
}
这样我们就利用链表实现了简单的功能,但是还存在许多缺点,比如无法实现删除某个节点,而且该代码只是带大家初步认识链表,后续还会为大家带来更为深入的链表知识。