链表是一种链式的数据结构,我们可以在链的任何一个结点将链断开,并在这里增加一个新的结点
链表和数组一样,都可以用来存储数字和字符
但是它们之间也有很大的区别
例如:
一个数组只能存储一种类型的数据;
而链表可以同时存储多种类型的数据;
就拿人的属性来举例子,
数组只能存储人的一种属性,比如年龄,姓名,性别
而数组可以同时储存这些属性,而我们需要做的只是定义一个结构体;


下面以一个例子来分析怎么制作一张链表;


1
2
#include<stdio.h>
#include<stdlib.h>

第一步定义需要存储的数据类型,用结构体定义出来


1
2
3
4
5
6

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

1
2
3

int main()
{

第二步,定义制作链表和操作链表所需要的
头指针(head),一个用于存放当前结点的指针(p),一个代表上一个结点的指针(q)
还有一个遍历链表时用的临时指针(t);
因为这些指针都是对结点进行操作的指针,因此其指针的类型应该为与结点的数据类型一致(struct node *);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct node *head,*p,*q,*t;
int i,n,a;
scanf("%d",&n);
head=NULL;//头指针初始为空
for(i=1;i<=n;i++)
{
scanf("%d",&a);

/*动态申请一个空间,用来存放一个节点,并用临时指针p指向这个节点
因为malloc申请的空间默认无类型且可以强制转换为任意类型,所以我们将它转换为
struct node * 的类型 */

p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
if(head==NULL)
head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
else
q->next=p;//如果这不是第一个创建的结点,则将上一个节点的后继指针指向该结点
q=p;//该节点变为下一个结点的上一个结点;
}

用临时指针t来遍历该链表,并打印链表的内容;


1
2
3
4
5
6
7
8

t=head;
while(t!=NULL)
{
printf("%d",t->data);
t=t->next;//移向下一个结点
}
return 0;

最后更新: 2018年01月23日 10:03

原始链接: http://drac0nids.top/2017/08/23/链表小结/

× 请我吃糖~
打赏二维码