单链表是一种数据的组合形式。它在插入和删除数据时效率比数组高。单链表的存储空间是在程序运行时动态分配的。由于在很多应用中数据的大小在编译的时候无法确定,因此动态分配存储空间是单链表的一个优点。
因为c库中没有现成的链表这种数据结构,所以需要开发者用结构体自己构建。
单链表分为头节点和普通节点。尾节点也是普通节点,只不过指针指向NULL。
构建头结点:
1 struct Header //头结点
2 {
3 int length; //记录链表大小
4 struct Node * next; //指向第一个节点的指针
5 }
构建普通节点:
1 struct Node //普通节点
2 {
3 int data; //数据域
4 struct Node * next; //指向下一个节点的指针
5 }
为了使用方便,将两个struct用typedef重新定义新的名称:
typedef struct Node Body_node; //将struct Node重命名为Bode_node
typedef struct Header Head_node; //将struct Header重命名为Head_node
创建链表:
1 Head_node * createList() //Head_node是struct Header的别名,是头结点类型
2 {
3 Head_node * head_n = (Head_node * )malloc(sizeof(Head_node)); //为头结点分配内存
4 head_n->length = 0; //初始化头结点
5 head_n->next = NULL;
6 return head_n; //将头结点地址返回
7 }
获取链表大小:
1 int Size(Head_node * head_n) //获取链表大小
2 {
3 if(head_n == NULL)
4 {
5 printf("参数传入错误!");
6 return 0;
7 }
8 return head_n->length;
9 }
插入元素:
int Insert(Head_node * head_n, int pos, int val) //在某个位置插入某个元素,插入成功返回1
{
//先做健壮性判断
if(head_n == NULL || pos < 0 || pos > head_n->length)
{
printf("参数传递有误!");
return 0;
}
//再向链表中插入元素时,先要找到这个位置
Body_node * pval = (Body_node)malloc(sizeof(Body_node)); //先分配一块内存来存储要插入的数据
pval->data = val; //当前指针指向头结点后面的第一个节点
Body_node * pCur = head_n->next;
if(pos == 0) //插入在第一个位置
{
head_n->next = pval; //指针断开连接过程
pval->next = pCur;
}
else
{
for(int i = 1;i < pos;i++) //找到要插入的位置
{
pCur = pCur->next;
}
pval->next = pCur->next; //指针断开再连接的过程
pCur->next = pval;
}
head_n->length++; //增加一个元素,长度要加1
return 1;
}
查找某个元素
Body_node * find(Head_node * head_n, int val) //查找某个元素
{
//先做健壮性判断
if(head_n == NULL)
{
printf("参数传入有误!");
return NULL;
}
//遍历链表来查找元素
Body_node * pTmp = head_n->next;
do
{
if(pTmp->data == val)
{
return pTmp;
}
pTmp = pTmp->next;
}while(pTmp->next != NULL); //循环条件知道链表结尾
printf("没有值为%d的元素!", val);
return NULL;
}
未完待续
原文:https://www.cnblogs.com/junsircoding/p/singlenode.html