- 整理思维导图
- 重写链表的代码
- 实现链表,按值查找返回位置的功能,按位置查找返回值,释放单链表,链表逆置
1.整理思维导图
2.重写链表的代码
3.实现链表,按值查找返回位置的功能,按位置查找返回值,释放单链表,链表逆置
//11、按值查找返回元素位置,链表中元素位置从1开始
int search_value(node_p H,datatype key)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return -1;
}
node_p p = H->next;
int i = 1; //默认从第一个位置开始查找
while(p!=NULL) //遍历整条链表
{
if(p->data == key) //如果找到指定值,返回位置
{
return i;
}
i++;
p = p->next;
}
printf("没有该元素\n");
return -2;
}
//12、按位置查找返回值
int search_pos(node_p H,int pos)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return -1;
}
//位置合理性
if(pos<1||pos>H->len)
{
printf("位置不合理\n");
return -2;
}
int i = 0;
node_p p = H;
for(i=0;i<pos;i++)
{
p=p->next;
}
return p->data;
}
//13、释放单链表
void free_link(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return ;
}
//如果只有头结点,直接释放头结点
if(H->next==NULL)
{
free(H);
}
int i = 1;
int count = H->len; //保存链表的初始长度
for(i=1;i<=count;i++)
{
dele_head(H);
}
}
//14、链表的逆置(笔试题)
void overturn(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return ;
}
if(empty_link(H)||H->next->next==NULL)
{
printf("空或只有一个元素\n");
return;
}
//保留原来的第二个结点
node_p p = H->next->next;
//先给原来第一个结点的指针域置空
H->next->next = NULL;
node_p q;
while(p!=NULL)
{
q = p->next; //保留下一个要头插的结点
//把p头插
p->next = H->next;
H->next = p;
//让p指向下一个要头插的结点
p = q;
}
}