- 整理思维导图
- 实现链表,按值查找返回位置的功能,按位置查找返回值,释放单链表,链表逆置
#include "link.h"
//创建单链表
node_p create_link_list()
{
//把头结点创建出来
node_p H=(node_p)malloc(sizeof(node));
//如果申请失败,返回NULL
if(H==NULL)
{
return NULL;
}
H->len=0;
H->next=NULL;
return;
}
//创建结点
node_p create_node(datatype data)
{
node_p new=(node_p)malloc(sizeof(node));
if(new==NULL)
{
return NULL;
}
}
//头插 插入无需判满
void insert_head(node_p H,datatype data)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
node_p new=create_node(data);
new->next=H->next;
H->next=new;
H->len++;
}
//判空
int empty_link(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return -1;
}
return H->next==NULL?1:0;
}
//头删
void dele_head(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
if(empty_link(H))
{
printf("链表为空\n");
return;
}
//先保留要删除的结点
node_p del=H->next;
//让结点指向,要删除结点的下一个结点
H->next=H->next->next;
//释放要删除的结点
free(del);
H->len--;
}
//输出
void show_link(node_p H,datatype data)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
//先保留第一个结点地址
node_p p=H->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("NULL");
}
//尾插
void insert_tail(node_p H,datatype data)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
node_p p=H->next;
while(p!=NULL)
{
p=p->next;
}
//创建一个新结点
node_p new=create_node(data);
H->next=new;
new->next=NULL;
H->len++;
}
//尾删
void dele_tail(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
if(empty_link(H))
{
return;
}
//
node_p p=H->next;
if(H->next!=NULL)
{
p=p->next;
}
//
node_p del=p->next;
free(del);
p->next=NULL;
H->len--;
}
//按位置插入
void insert_pos(node_p H,datatype data,int pos)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
//判断位置合理性
if(pos<1||pos>H->len)
{
printf("位置不合理\n");
return;
}
//
node_p new=create_node(data);
//按位置插入
node_p p=H;
for(int i=0;i<pos-1;i++)//找到pos-1的结点
{
p=p->next;
}
//
new->next=p->next;
p->next=new;
H->len++;
}
//按位置删除
void dele_pos(node_p H,int pos)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return;
}
//判断位置合理性
if(pos<1||pos>H->len)
{
printf("位置不合理\n");
return;
}
node_p p=H;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
//保存要删除的结点
node_p del=p->next;
//删除结点
p->next=p->next->next;
free(del);
H->len--;
}
//按值查找返回元素位置
void search_value(node_p H,datatype key)
{
if(H==NULL)
{
printf("入参为空\n");
return;
}
node_p p=H;
for(int i=0;i<H->len;i++)
{
if(p->data==key)
printf("%d\n");
return;
}
printf("没有该元素\n");
}
//按位置查找返回值
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;
}
node_p p=H;
for(int i=0;i<H->len;i++)
{
p=p->next;
}
H->data=p->next;
printf("%d\n",p->data);
return;
}
//释放单链表
void free_link(node_p H)
{
if(H==NULL)
{
printf("入参为空,请检查\n");
return -1;
}
H->next=0;
free(H);
}