工程实践实训日报六
项目名称 【苏嵌实训-嵌入式 linux C 第 6天】
今日进度以及任务
今天主要回顾了不带头结点的单链表的创建以及使用,练习了头插法、尾插法、中间插入结点的方法。
本日任务完成情况
动手写了单链表的相关的代码实现,对单链表的创建,结点的增删改查知识点有了一个回顾,也对带头结点的单链表与不带头结点的单链表的区别和操作上的不同有了一个清晰的认识。
本日开发中出现的问题汇总 起初忽略了不带头结点的单链表与带头结点的单链表在操作上的不同,导致像老师实践的那样运行报错。
本日未解决问题 无
本日开发收获 对单链表中头结点发挥的作用,在操作上带来的便利有了一个深刻的体会,引入头结点可以统一在链表的第一个位置上的操作和在表其他位置上的操作。使空表与非空表的处理也得到统一。
其他 链表这里的算法题型比较灵活,比较看重算法思想,一个好的算法能够节省大量的时间、空间开销,为系统节省资源。必要的时候解题可以借助画图帮助理解。
笔记
1. 数据结构-链表(单链表)
-
嵌入式方向需要掌握的数据结构
栈、队列、链表、二叉树、平衡二叉树、红黑树、哈希表、图 -
数据结构的作用
管理数据的存取 -
链表
动态管理:使用时分配 -
链表实现
/**
*无头链表
*
*/
#include <stdio.h>
#include <stdlib.h>
//1\定义节点类型:只要确定数据域保存哪些数据,链接域是固定的!<节点的指针>
struct node
{
int num; //数据域
struct node *next; //链接域:保存下一个节点的地址
};
typedef struct node Node;
typedef Node *Link;
//Link head; 尽量不要使用全局变量,不安全;
void print_error(int ret)
{
switch (ret)
{
case 0:
{
printf("handle success!\n");
break;
}
case -1:
{
printf("link is null!\n");
break;
}
case -2:
{
printf("node is not find!\n");
break;
}
default:
{
printf("not error!\n");
exit(1);
}
}
}
void create_link(Link *head)
{
*head = NULL;
}
void insert_head_node(Link newnode, Link *head)
{
newnode->next = *head;
*head = newnode;
}
void insert_tail_node(Link newnode, Link *head)
{
Link temp = *head;
//对空表做处理
if (*head == NULL)
{
newnode->next = NULL;
*head = newnode;
}
else
{
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = NULL;
}
}
int insert_mid_node(int num, Link newnode, Link *head)
{
Link temp = *head;
if (*head == NULL)
{
return -1;
}
while (temp != NULL)
{
if (temp->num == num)
{
newnode->next = temp->next;
temp->next = newnode;
return 0;
}
temp = temp->next;
}
return -2;
}
int delete_node(int num, Link *head)
{
if (*head == NULL)
{
return -1;
}
Link temp = *head;
if (temp->num == num) //对第一个节点做判断
{
*head = (*head)->next;
free(temp);
temp = NULL;
return 0;
}
//形成前后指针
Link p = temp;
temp = temp->next;
while (temp != NULL)
{
if (temp->num == num)
{
p->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
p = temp;
temp = temp->next;
}
return -2;
}
void display_link(Link head)
{
Link temp = head;
while (temp != NULL)
{
printf("%d\n", temp->num);
temp = temp->next;
}
}
int main(int argc, char *argv[])
{
//2、定义头指针
Link head;
Link newnode;
create_link(&head);
if (NULL == head)
{
printf("init link success!\n");
}
else
{
printf("init link failed!\n");
}
for (int i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if (NULL == newnode)
{
printf("malloc error!\n");
exit(1);
}
newnode->num = i + 1;
//insert_head_node(newnode,&head);
insert_tail_node(newnode, &head);
}
newnode = (Link)malloc(sizeof(Node));
newnode->num = 15;
int ret = insert_mid_node(5, newnode, &head);
print_error(ret);
ret = delete_node(3, &head);
print_error(ret);
display_link(head);
return 0;
}
/**
*
*有头链表
*/
#include <stdio.h>
#include <stdlib.h>
//1\定义节点类型:只要确定数据域保存哪些数据,链接域是固定的!<节点的指针>
struct node
{
int num; //数据域
struct node *next; //链接域:保存下一个节点的地址
};
typedef struct node Node;
typedef Node *Link;
//Link head; 尽量不要使用全局变量,不安全;
void is_malloc(Link p)
{
if (NULL == p)
{
printf("malloc error!\n");
exit(1);
}
}
void print_error(int ret)
{
switch (ret)
{
case 0:
{
printf("handle success!\n");
break;
}
case -1:
{
printf("link is null!\n");
break;
}
case -2:
{
printf("node is not find!\n");
break;
}
default:
{
printf("not error!\n");
exit(1);
}
}
}
void create_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
is_malloc(*head);
(*head)->next = NULL;
}
void insert_head_node(Link newnode, Link *head)
{
newnode->next = (*head)->next;
(*head)->next = newnode;
}
void insert_tail_node(Link newnode, Link *head)
{
Link temp = *head;
//对空表做处理
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = NULL;
}
int insert_mid_node(int num, Link newnode, Link *head)
{
Link temp = (*head)->next;
while (temp != NULL)
{
if (temp->num == num)
{
newnode->next = temp->next;
temp->next = newnode;
return 0;
}
temp = temp->next;
}
return -2;
}
int delete_node(int num, Link *head)
{
Link temp = *head;
//形成前后指针
Link p = temp;
temp = temp->next;
while (temp != NULL)
{
if (temp->num == num)
{
p->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
p = temp;
temp = temp->next;
}
return -2;
}
void display_link(Link head)
{
Link temp = head->next;
while (temp != NULL)
{
printf("%d\n", temp->num);
temp = temp->next;
}
}
int main(int argc, char *argv[])
{
//2、定义头指针
Link head;
Link newnode;
create_link(&head);
if (NULL == head)
{
printf("init link success!\n");
}
else
{
printf("init link failed!\n");
}
for (int i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if (NULL == newnode)
{
printf("malloc error!\n");
exit(1);
}
newnode->num = i + 1;
insert_head_node(newnode, &head);
//insert_tail_node(newnode, &head);
}
newnode = (Link)malloc(sizeof(Node));
newnode->num = 15;
int ret = insert_mid_node(5, newnode, &head);
print_error(ret);
ret = delete_node(3, &head);
print_error(ret);
display_link(head);
return 0;
}