单向链表
单链表:单链表是一种链式存取的数据结构,用一组地址任意的储存单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个节点的构成:元素(数据元素的映像)+指针(指示后继元素存储位置),元素就是存储数据的数据单元,指针就是连接每个结点的地址数据
单链表的数据结构
head为头结点,不存放任何数据,它的作用是充当一个指向链表中真正存放数据的第一个节点
其中DATA为数据域,该内存存放的是数据;NEXT是地址域,数据类型为指针,该内存存放的是下一段内存的内存地址
有头链表
有头链表指的是链表初始化时就有一个头结点,并且头指针始终指向该头结点,该头结点的数据域不存在数据。如图所示
循环链表
循环链表指的是链表的尾节点指针指向头节点地址,从而形成环状如图:
单链表
源码如下:
#include <stdio.h>
struct link //结构体
{
int data; //数据域
struct link *next; //指针域
};
int main()
{
struct link n0, n1, n2;
n0.data = 10;
n1.data = 20;
n2.data = 30;
n0.next = &n1;
n1.next = &n2;
n2.next = NULL;
printf("%d\n", n0.data);
printf("%d\n", n0.p->data);
printf("%d\n", n1.p->data);
return 0;
}
*“.”和“->”的区别
C语言中“.”的意思是给的是立即数地址,“->”的意思是给的是指针。"."的左操作数为值,"->"的左操作数为指针。"."和"->"实际是可以合并为一个操作符的,在很多新语言中对值和指针取成员已经统一为"."了,C中保留只是一种传统的延续。
*结构体
结构体在C语言中属于自定义数据类型,我们知道数组是同一数据类型的集合,那结构体可以看成不同数据类型的集合,比如我们要存储一个游戏角色的名字、等级、血量值、防御值、职业、技能等级信息时,我们就会发现这些属性对应的是不同的数据类型,这种情况下,为了更好的对应角色,我们可以将它们的相关信息全部封装到一个类型中,此时我们就会用到结构体来进行同意封装,所以结构体也是C语言编程中非常常见的一个数据类型
遍历、头插、尾插链表
#include <stdio.h>
#include <stdlib.h>
struct links
{
int data;
struct links *next;
};
void showList(struct links *p)//链表遍历
{
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
}
void installTail(struct links **h, struct links *n)//尾插法
{
n->next = *h;
*h = n;
}
struct links *headInsert(struct links *h, struct links *n)//头插法
{
n->next = h;
return n;
}
int main()
{
struct links *head = NULL;
struct links *h1 = NULL;
int i = 0;
int data[10] = {1,2,3,4,5,6,7,8,9,10};
while (i < (sizeof(data) / sizeof(int)))
{
h1 = malloc(sizeof(struct links));
h1->data = data[i];
h1->next = NULL;
installTail(&head,h1);
//head = headInsert(head,h1);
i++;
}
showList(head);
return 0;
}
*malloc是动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。
最后附上一首秋瑾先生的词供大家赏析
满江红·小住京华
小住京华,早又是中秋佳节。为篱下黄花开遍,秋容如拭。
四面歌残终破楚,八年风味徒思浙。
苦将侬强派作蛾眉,殊未屑!
身不得,男儿列。心却比,男儿烈!
算平生肝胆,因人常热。俗子胸襟谁识我?英雄末路当磨折。
莽红尘何处觅知音?青衫湿!