再看《深入理解C指针》第一页的时候,就看到说可以用数组实现链表,这么牛逼,看来一下他的示意图,直接干。然后写完链表的插入,擦除,显示链表,回过神来一想,这不是脱裤子放屁吗。我数组都已经知道元素关系了,还在内部添加元素之间的关系(插入的时候)。我可以遍历数组,却还用链表的思路遍历(删除的时候)。
本以为这种链表会像数组队列一样在单片机中大放异彩,但是思来想去似乎找不到应用场景。我就先做个记录吧,也许有一天能够用到。
#include "stdio.h"
#define LEN 10
typedef struct
{
unsigned char next;
unsigned char data;
}node_t;
node_t arr[LEN] = {0};
unsigned char unused_len = LEN;
int list_rear = -1;
int list_head = -1;
unsigned char list_is_empty(void)
{
unsigned char ret = 0;
if(list_rear == -1)
{
ret = 1;
}
return ret;
}
unsigned char list_is_full(void)
{
unsigned char ret = 0;
if(unused_len == 0)
{
ret = 1;
}
return ret;
}
unsigned char list_insert(unsigned char data)
{
unsigned char insert_fail = 0;
unsigned char i = 0;
if(list_is_full() == 1)
{
insert_fail = 1;
}
else
{
if(list_rear == -1)
{
arr[0].next = 0;
arr[0].data = data;
list_rear = 0;
list_head = 0;
}
else
{
for(i = 0; i < LEN; i++)
{
if(arr[i].next == 0 && list_rear != i)
{
arr[i].data = data;
arr[i].next = 0;
arr[list_rear].next = i;
list_rear = i;
break;
}
}
}
unused_len--;
}
return insert_fail;
}
unsigned char list_delete(unsigned char data)
{
unsigned char delete_fail = 0;
if(list_is_empty() == 1)
{
delete_fail = 1;
}
else
{
int temp = list_head;
int slow = temp;
if(arr[temp].data == data)
{
list_head = arr[temp].next;
arr[temp].data = 0;
arr[temp].next = 0;
}
else
{
temp = arr[temp].next;
while(arr[temp].data != data && temp != list_rear)
{
slow = temp;
temp = arr[temp].next;
}
if(temp == list_rear)
{
if(arr[temp].data = data)
{
list_rear = slow;
arr[temp].data = 0;
arr[temp].next = 0;
}
else
{
delete_fail = 1;
}
}
else
{
arr[slow].next = arr[temp].next;
arr[temp].data = 0;
arr[temp].next = 0;
delete_fail = 0;
}
}
unused_len++;
}
return delete_fail;
}
void show_list(void)
{
if(list_is_empty() == 1)
{
return;
}
else
{
int temp = list_head;
while(temp != list_rear)
{
printf("%d ", arr[temp].data);
temp = arr[temp].next;
}
printf("%d\r\n", arr[list_rear].data);
}
}
void main()
{
list_insert(1);
list_insert(2);
list_insert(3);
list_insert(4);
list_insert(5);
show_list();
list_delete(3);
show_list();
list_insert(6);
list_insert(7);
list_insert(8);
list_insert(9);
list_insert(10);
list_insert(11);
list_insert(12);
show_list();
while(1);
}
运行结果:
最后12没打印出来,实际是链表满了