DAY 4 数据结构

这篇文章详细介绍了如何在C语言中使用结构体和指针实现单链表,包括创建链表、节点操作(头插、尾插、按位置插入、删除)、查找元素位置和值以及释放链表。
摘要由CSDN通过智能技术生成
  1. 整理思维导图
  2. 实现链表,按值查找返回位置的功能,按位置查找返回值,释放单链表,链表逆置

 

 

#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);
}
 

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值