ikun课堂----图解链表(通俗易懂)

今天我们要讲的是链表
在这里插入图片描述

定义链表结构体

在这里插入图片描述

typedef struct _node
{
    int data;//数据域
    struct _node *next;//指针域
}Node;//创建结构体

声明函数

Node * make_node(Node* a,int n);//创建链表
Node * add(Node *a);//增添数据
Node * delete(Node *a);//删除数据
void _free(Node*);//释放数据
void _print(Node *a);//打印数据

创建链表(头插法)

在这里插入图片描述

 Node* make_node(Node* a,int n)//创建一个链表,并且存入数据
{
    int i;
    Node *head = NULL;//第一步

    a = (Node*)malloc(sizeof(Node));//第二步
    printf("输入数据:\n");
    scanf("%d",& a->data);
    a->next = NULL;//第三步 存入数据
    
    head = a;// 第四步
    i++;

    while(i!= n)
    {   
     a = (Node*)malloc(sizeof(Node));
     scanf("%d",&a->data);//第五步

     a->next = head;//第六步
     
     head = a;//第七步
     
     i++;
    }

 return a;
}

添加数据

特殊情况(仅有一个数据的链表)

在这里插入图片描述

    a=p;
    
   if(p->next==NULL)//仅有一个数据的链表
    {
      p->next=(Node*)malloc(sizeof(Node));//(1)
      p=p->next;
      p->next=NULL;
      p->data=data;
      return a;
    }          

一般情况

在这里插入图片描述

  for(;p!=NULL;p=p->next)
    {
        if(p->data==s)//(1)
        {
           Node *q;
           q=(Node*)malloc(sizeof(Node));
           q->data = data;//(2)

           q->next = p->next;//(3)

           p->next = q;//(4)
           
           return a;
        }

    }

删除数据

在这里插入图片描述

Node * delete(Node *a)
{
    int data;
    Node *p;
    printf("需要删除的数据为:\n");
    scanf("%d",&data);
  //需要删除的数据在第一个
    p=a;//(1)

    if(a->data==data)
    {
       a=a->next;//(2)
       free(p);//(3)
       return a;
    }
  //不在
    else
 {
    Node *q=NULL;//(1)
    for(;p!=NULL;q=p,p=p->next)
    {
      if(p->data==data)
      {
       q->next=p->next;//(2)(3)
       free(p);

       return a;
       }   

    }
 } 
}

free 函数

在这里插入图片描述

void _free(Node *a)
{
    Node *p;
   while(a!=NULL)
   {
     p=a;//(1)
     a=a->next;//(2)
     free(p);//(3)
   }
}

如果有不恰当的部分忘各位大佬指正,多多包涵,谢谢啦
在这里插入图片描述

在最后我给出了完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _node
{
    int data;
    struct _node *next;
}Node;//创建结构体

Node * make_node(Node* a,int n);
Node * add(Node *a);//添加数据
Node * delete(Node *a);
void _free(Node*);
void _print(Node *a);
int main()
{
    Node *a;
    int n;//创建一个长度为n的链表
    printf("创建一个多长的链表:\n");
    scanf("%d",&n);
    printf("创建:\n");
    a= make_node(a,n);
    _print(a);

    printf("添加:\n");
    a=add(a);
    _print(a);

    printf("删除:\n");
    a=delete(a);
    _print(a);

    _free(a);

    return 0;
}

Node* make_node(Node* a,int n)//创建一个链表,并且存入数据
{
    int i;
    Node *head = NULL;//第一步

    a = (Node*)malloc(sizeof(Node));//第二步
    printf("输入数据:\n");
    scanf("%d",& a->data);
    a->next = NULL;//第三步 存入数据
    
    head = a;// 第四步
    i++;

    while(i!= n)
    {   
     a = (Node*)malloc(sizeof(Node));
     scanf("%d",&a->data);//第五步

     a->next = head;//第六步
     
     head = a;//第七步
     
     i++;
    }

 return a;
}

Node * add(Node *a)//添加数据
{
    Node *p;
    int data,s;
    printf("在哪个数据后面添加:\n");
    scanf("%d",&s);
    printf("添加的数据为:\n");
    scanf("%d",&data);
    //开始遍历

    p=a;

    if(p->next==NULL)//仅有一个数据的链表输出结果
    {
      p->next=(Node*)malloc(sizeof(Node));
      p=p->next;
      p->next=NULL;
      p->data=data;
      return a;
    }                    
    else
 {
    for(;p!=NULL;p=p->next)
    {
        if(p->data==s)//(1)
        {
           Node *q;
           q=(Node*)malloc(sizeof(Node));
           q->data = data;//(2)

           q->next = p->next;//(3)

           p->next = q;//(4)
           
           return a;
        }

    }
 }
}    
Node * delete(Node *a)
{
    int data;
    Node *p;
    printf("需要删除的数据为:\n");
    scanf("%d",&data);
  //需要删除的数据在第一个
    p=a;//(1)

    if(a->data==data)
    {
       a=a->next;//(2)
       free(p);//(3)
       return a;
    }
  //不在
    else
 {
    Node *q=NULL;//(1)
    for(;p!=NULL;q=p,p=p->next)
    {
      if(p->data==data)
      {
       q->next=p->next;//(2)(3)
       free(p);

       return a;
       }   

    }
 } 
}
void _print(Node *a)
{
    Node *head;
    printf("打印结果:\n");
    for(head=a;head!=NULL;head=head->next)
    {
        printf("%d ",head->data);
    }
    printf("\n");

}
void _free(Node *a)
{
    Node *p;
   while(a!=NULL)
   {
     p=a;//(1)
     a=a->next;//(2)
     free(p);//(3)

   }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值