线性表是最基本的一种数据结构,是0个以上数据元素的有限序列。
由线性表的定义,我们可以得出线性表的两个特性。
首先它是一个序列,即元素之间是有序的。除了第一个元素外,每一个元素都有且只有一个直接前驱元素;除了最后一个元素外,每一个元素都有且只有一个直接后驱元素。也就是说,元素之间是一对一连接起来的。
其次它的元素是有限的,最少为0个,当元素为0个时,称之为空表。
根据线性表的序列特性,计算机可以用两种方法来实现线性表:
1、开辟一块连续的内存,将数据元素一个一个放入进去,说白了也就是用数组来实现线性表。这种实现方式对于读数据来说比较快,但对于插入和删除来说,就比较尴尬了。一般来说,不会用这种方法实现线性表这种数据结构。
2、链表。(重点来了)
链表是一种递归的数据结构。
链表中的元素为结点,结点由两部分组成,一是存储元素值的数据域、二是存储指向下一个结点地址的指针域(或者是NULL),如果该结点的指针域为NULL,则称该结点为尾结点,也就是链表的结尾。
以下简单的代码让同学们更加直观的感受一下链表。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}Node, *PNode;
// 声明创建链表函数
PNode CreateList(void);
// 声明遍历链表函数
void PrintfList(PNode List);
int main()
{
PNode List = CreateList();
PrintfList(List);
getchar();
return 0;
}
PNode CreateNode()
{
PNode newNode = (PNode)malloc(sizeof(Node));
if (newNode == NULL) {
printf("out of memory.\n");
exit(1);
}
newNode->next = NULL;
return newNode;
}
PNode CreateList(void)
{
int length; //链表个数,作为循环结束的条件
ElemType data; //链表结点数据域的值
PNode Head = CreateNode();
PNode s = Head;
printf("输入链表个数:");
scanf_s("%d", &length);
for (int i = 1; i <= length; i++){
PNode P = CreateNode();
printf("第%d个结点的data值:", i);
scanf_s("%d", &data);
while (s->next) {
s = s->next;
}
P->data = data;
s->next = P;
}
getchar();
printf("创建链表成功\n");
return Head;
}
void PrintfList(PNode List)
{
PNode P = List->next;
printf("链表为:");
if (P == NULL) {
printf("链表为空");
}
while (P != NULL){
printf("%d", P->data);
P = P->next;
}
printf("\n");
}
可能有人会说,就这么简单的输出几个数字,搞得这么麻烦,我一个数组就直接搞定了。
哼,我才不管你呢。增删的好处我也不会告诉你的。