链表基本概念(详细内容可自己百度或查询相关书籍):
链表就是包含数据的独立数据结构的集合。链表中的每个节点通过链表或指针链接在一起,程序通过指针访问链表中的节点。
注: 链表的其他综合实践案例可到我的资源查看下载,没有币的小伙伴可以给我留言,可以打包发送。
单链表:
在单链表中,每个节点包含一个指向下一节点的指针。链表最后一个节点的指针字段的值为NULL,表示链表后面不在有其他节点了。遍历单链表的可以从链表开始位置开始直到结束位置,但链表不可以从相反的方向进行遍历。后面介绍的双链表则可解决此问题。
1.插入到一个有序的单链表
/*
单链表插入节点
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct NODE
{
struct NODE *link;
int value;
}Node;
int sll_insert(Node **linkp, int new_value);
int main()
{
int ret_val;
int a = 12;
Node **link ;
sll_insert(link, a);
return 0;
}
int sll_insert(Node **linkp, int new_value)
{
register Node *current;
register Node *new;
/*寻找正确的插入位置,方法是按序访问链表,直到到达
一个其大于或等于新值的节点*/
while((current = *linkp ) != NULL && current -> value < new_value )
linkp = ¤t -> link;
/*为新节点分配内存,并把新值存储到新节点中*/
new = (Node *)malloc(sizeof(Node));
if(new == NULL)
return FALSE;
new -> value = new_value;
//把新节点插入到链表中,并返回 TRUE
new -> link = current;
*linkp = new;
return TRUE;
}
双链表:
双链表是单链表很好的替代方案。在双链表中,每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。这可以使我们以任何方式遍历双链表,甚至可以忽前忽后的在链表中访问。
2.双链表插入节点
/*
双链表插入节点
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE
{
struct NODE *fwd;
struct NODE *bwd;
int value;
}Node;
int dll_insert(register Node *rootp, int value);
int main()
{
register Node *root;
static const int a = 10;
dll_insert(root, a);
return 0;
}
int dll_insert(register Node *rootp, int value)
{
register Node *this;
register Node *next;
register Node *newnode;
/*
*查看value 是否已经存在于链表中,如果是就返回。
*否则,为新值创建一个新节点("newnode"将指向他)
*"this" 将指向应该在新节点之前的那个节点。
*"next" 将指向应该在新节点之后的那个节点。
*/
for(this = rootp; (next = this -> fwd) != NULL; this = next)
{
if(next -> value == value)
return 0;
if(next -> value >value)
break;
}
newnode = (Node *)malloc(sizeof(Node));
if(newnode == NULL)
return -1;
newnode -> value = value;
if(this != rootp)
newnode -> bwd = this;
else
newnode -> bwd = NULL;
if(next != NULL)
next -> bwd = newnode;
else
rootp -> bwd = newnode;
return 1;
}
最后觉得有用不忘点赞或转发o ^ ^ o ,thank U ~