一·静态链表
1.链表就是将很多个结构体串起来,连成一条链
通过指针来找到下一个结构体
就是让上一个结构体的指针指向下一个结构体,即这个指针装着下一个结构体的地址。
#include <stdio.h>
struct ren {
char name[20];
char sex[10];
int age;
struct ren* next; //声明一个结构体指针
};
int main(void)
{
struct ren a, b, c, d, e;
struct ren* head; //声明一个头指针
struct ren* p;
a.age = 10;
strcpy(a.name, "长风");
strcpy(a.sex, "男");
b.age = 11;
strcpy(b.name, "破浪");
strcpy(b.sex, "女");
c.age = 12;
strcpy(c.name, "云帆");
strcpy(c.sex, "男");
d.age = 13;
strcpy(d.name, "远影");
strcpy(d.sex, "女");
e.age = 13;
strcpy(e.name, "碧空");
strcpy(e.sex, "女");
head = &a; //头指针指向第一个结构体a
a.next = &b; // a中的指针指向下一个结构体b
b.next = &c; //之后同理
c.next = &d;
d.next = &e;
e.next = NULL;
p = head;
while (p != NULL)
{
printf("%s %s %d \n", p->name, p->sex, p->age);
p = p->next;
}
}
二·动态链表
静态链表的缺点是定义的结点(结构体)数固定,在使用时可能定义的结点数不够,或太多而占用内存,所以就产生了动态链表。
动态链表可以在需要多少就建立多少
尾插法
先创建一个头结点,可以向其中放入数据,也可以不放人数据(这里讲不放入数据的)
struct student{
int data;
struct student *next;
};
//声明一个创建头结点的函数
struct student*creat_head(void)
{
//为头结点申请一块空间
struct student*Head = (struct student*)malloc(sizeof(struct student));
//让头结点中的指针指向空
Head->next = NULL;
//返回这个头结点
return Head;
}
然后就是增加链表的结点,写一个增加结点的函数
void add_node(struct student*Head,int data)
{
//创建一个结点,初始指向头结点
struct student* now = Head;
//让这个结点每次都指向链表的最后一个结点,使得新建的结点能插在链表尾
while(now->next != NULL)
{
now = now->next;
}
//为新结点申请内存
struct student* p = (struct student*)malloc(sizeof(struct student));
//为p结点数据赋值
p->data = data;
//让p结点中的指针指向空
p->next = NULL;
//让链表的尾结点中的指针指向新创建的结点,使得链表加长
now->next = p;
}
//这个函数调用一次增加一个结点
可以使用循环增加
void add_node(struct student*Head,int data[]) // 可以传入数组
{
//创建一个结点,初始指向头结点
struct student* now = Head;
//让这个结点每次都指向链表的最后一个结点,使得新建的结点能插在链表尾
while(now->next != NULL)
{
now = now->next;
}
int i ;
for(i = 0;i < 5;i++) // 创建五个结点
//为新结点申请内存
{
struct student* p = (struct student*)malloc(sizeof(struct student));
//为p结点数据赋值
p->data = data[i];
//让p结点中的指针指向空
p->next = NULL;
//让链表的尾结点中的指针指向新创建的结点,使得链表加长
now->next = p;
//*************************//
//很重要的一步,让now指向p,这样就能循环了,now每次都是尾结点
//,就可以接着指向新的创造的结点了,一直循环下去
now = p;
}
}
链表的遍历,利用while语句
int main(void)
{
int data[5];
int i;
for(i = 0; i < 5;i++)
{
scanf("%d",&a[i]);
}
struct student*Head = creat_head();
add_node(Head,data);
struct student*p = Head->next // 因为我们的头结点中没有数据,所以我们让p指
//指向头结点的下一个结点
while(p != NULL)
{
printf("%d",p->data);
p = p->next; //让p指向p的下一个结点
}
return 0;
}