嵌入式笔记
1.单链表组织与存储
2单链表常见操作
(1)初始化
(2)查询第i个数据,并放回data区域
1.单链表组织与存储
typedef struct _link_node
{
elem_type data;
struct _link_node *next;
} link_node , *link_list;
2单链表常见操作
(1)初始化
int init_link(link_list *list) //注意,这里是指针的指针,相当于**link_node,实际含义是存放link_node指针的指针
{
*list= (link_list)malloc(sizeof(link_node)); //*list是一个link_node指针。即分配一个link_node大小的空间给*list指针。
if(!list)
{
return -1;
}
memset(&((*list)->data),0,sizeof(elem_type)); //初始化data段的内存空间,第一个参数必须是指针,因此用&取址
}
(2)查询第i个数据,并放回data区域
int init_link(link_list *list) //注意,这里是指针的指针,相当于**link_node,实际含义是存放指针的链表的指针
{
*list= (link_list)malloc(sizeof(link_node)); //*list是一个link_node指针。即分配一个link_node大小的空间给*list指针。
if(!list)
{
return -1;
}
memset(&((*list)->data),0,sizeof(elem_type)); //初始化data段的内存空间,第一个参数必须是指针,因此用&取址
}
(3)合并两个链表(根据id大小)。输入链表头list_a,list_b,返回链表头list_c。
int merge(link_node list_a,link_node list_b, link_node list_c)
{
link_list pa,pb,pc;
//虽然有表头list_a,list_b,list_c,但运算过程中还是需要元素指针
pa = list_a->next;
pb = list_b->next; //链表头本身没数据,next才是下一个元素。
list_c = pc = list_a;
while(pa && pb) //pa和pb存在,才循环运算
{
if(pa->data < pb->data)
{
pc->next = pa; //把pa添加到list_c中。注意。pc最开始和list_c是同一个头,所以pc所指的next链表,也是所指向list_c的。
pc = pa; //移动pc上的指针到新的指针:pa位置上
pa = pa->next; //移动指向list_a的指针
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//pa或pb某一指针指向链尾,为NULL,则把还没到尾的那个练表直接连接到list_c结尾
pc->next = pa?pa:pb;
}