1单链表任意位置删除
思路:
判断头结点是否存在
判断删除位置是否合法
找到pos-1位置起名字p
删除p结点后面的结点
main.c
// 按任意位置删除
printf("\n请输入要删除的位置:");
scanf("%d", &pos);
delete_by_pos(L, pos);
printf("按任意位置删除后的数据\n");
Out(L);
test.c
// 按任意位置删除
int delete_by_pos(Linklist L, int pos)
{
// 1.判断头节点是否存在
// 2.判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("删除失败\n");
return -1;
}
// 找到pos-1位置起名字p
Linklist p = L;
for (int i = 0; i < pos - 1; i++)
{
p = p->next; // 移动p的位置
}
// 删除p结点后面的结点
Linklist N = p->next;
p->next = N->next;
free(N);
N = NULL; // 防止野指针
L->len--;
return 0;
}
2单链表任意位置修改
思路:
判断头结点是否存在
判断修改位置是否合法找到pos位置起名字p
修改p结点的数据域【赋值】
main.c
// 按任意位置修改
printf("\n请输入要修改值的下标:");
scanf("%d", &pos);
printf("请输入要修改的值:");
scanf("%s", e);
revamp_by_pos(L, pos, e);
printf("按任意位置修改后的数据\n");
Out(L);
test.c
// 按任意位置修改
int revamp_by_pos(Linklist L, int pos, datetype e)
{
// 1.判断头节点是否存在
// 2.判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("修改失败\n");
return -1;
}
// 找到pos位置起名字p
Linklist p = L;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
// 修改p结点的数据域【赋值】
strcpy(p->date, e);
return 0;
}
3单链表任意位置查找
思路:
判断头结点是否存在
判断查找位置是否合法找到pos位置起名字p
查找p结点的数据域【输出】
main.c
// 按任意位置搜索
printf("\n请输入想要查找的下标:");
scanf("%d", &pos);
find_by_pos(L, pos);
// printf("%d下标对应的值是%d", pos, flag);
test.c
// 按任意位置搜索
int find_by_pos(Linklist L, int pos)
{
// 1.判断头节点是否存在
// 2.判断链表是否为空
if (L == NULL || L->len == 0)
{
printf("查找失败\n");
return -1;
}
// 找到pos位置起名字p
Linklist p = L;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
// 查找p结点的数据域【输出】
printf("%d下标对应的值是%s\n", pos, p->date);
return 0;
}