C语言 链表系列

目录

1.简单链表

2.头插法

3.销毁 与 删除

4.逆序

5.头节点链表


1.简单链表

#include<stdio.h>

typedef struct node
{
    int data;
    struct node *next;
}node;

node *head = NULL;

void traverse()  //遍历
{ 
    node *p = head;

    while( p != NULL)
    {
        printf ("%d ",p -> data);
        p = p -> next;
    }
    printf ("\n");

}

int main()
{
    node n1 = {1,NULL};
    node n2 = {2,NULL};
    node n3 = {3,NULL};
    node n4 = {4,NULL};
    node n5 = {5,NULL};
    node n6 = {6,NULL};
    node n7 = {7,NULL};
    node n8 = {8,NULL};
    node n9 = {9,NULL};
  
    head = &n1;
    n1.next = &n2;
    n2.next = &n3;
    n3.next = &n4;
    n4.next = &n5;
    n5.next = &n6;
    n6.next = &n7;
    n7.next = &n8;
    n8.next = &n9;
    n9.next = NULL;

    traverse();
    return 0;
}

2.头插法

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

typedef struct node
{
    int data;
    struct node *next;
}node;

node *head = NULL;

node *mk_node(int item)   //   分配空间
{
    node*p = (node *)malloc(sizeof(node)); // 分配空间 (node *)强制类型转换
    if (p == NULL)
    {
        printf("malloc failed\n");
        exit(1);
    }

    p -> data = item;  // 初始化
    p -> next = NULL;

    return p;  //返回节点地址
}

void free_node(node *p)  //释放节点函数 谁申请 谁释放
{
    free(p);
}

void insert_node(node *p)  // 头插法
{
    p -> next = head;
    head = p;
}

void traverse()  //遍历
{ 
    node *p = head;

    while( p != NULL)
    {
        printf ("%d ",p -> data);
        p = p -> next;
    }
    printf ("\n");

}

int main()
{

    node *p;
    int i;

    for (i = 1; i < 10; i++)
    {    
        p = mk_node(i);  // 调用函数 给值
        insert_node(p);  // 头插法

        traverse();
    }
    return 0;
}

3.销毁 与 删除

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

typedef struct node  //定义结构体
{
    int data;
    struct node *next;
}node;

node *head = NULL;  //定义头指针 指 链表开头

node *mk_node(int item)   //   分配空间
{
    node*p = (node *)malloc(sizeof(node)); // 分配空间 (node *)强制类型转换
    if (p == NULL)
    {
        printf("malloc failed\n");
        exit(1);
    }

    p -> data = item;  // 初始化
    p -> next = NULL;

    return p;  //返回节点地址
}

void free_node(node *p)  //释放节点函数 谁申请 谁释放
{
    free(p);
    p = NULL;
}

void insert_node(node *p)  // 头插法
{
    p -> next = head;
    head = p;
}
void insert_node_l2b(node *p)//插入排序
{
    if(head == NULL)
    {
        head = p;
        return;
    }

    if(p->data < head->data)//在head的前
    {
        insert_node(p);
        return;
    }


    node *pre = head;//在head的后 

    while(pre->next != NULL)
    {
        if(pre->next->data >= p->data)//pre下一个节点数值大于p 则跳出循环
        {
            break;
        }
        pre = pre->next;
    }
    p->next = pre->next;
    pre->next = p;
}


void traverse()  //遍历
{ 
    node *p = head;

    while( p != NULL)
    {
        printf ("%d ",p -> data);
        p = p -> next;
    }
    printf ("\n");
}

node *search(int target)  //查找  
{ 
    node *p = head;

    while( p != NULL)
    {
        if (p->data  == target)
        {
            return p;
        }
        p = p ->next;
    }
    return NULL;
}

void rm_node(node *p)   //删除
{
    if (head == p)  //在第一个情况 头
    {
        head = head->next;
        return ;
     }

    node *pre = head;  //从头结点的下一个节点开始删除

    while (pre->next != NULL) 
    {
        if (pre->next == p)
        {
            pre->next = p->next; // 直接跳过删除目标
            p->next = NULL;
            return;
        }
        pre = pre->next;
    }

}

void destroy()  // 销毁节点
{
    node *p;

    while (head != NULL)
    {
      p = head;
      head = head->next;
      free_node(p);
    }
}

int main()
{

    node *p;
    int i;
    int target;

    for (i = 1; i < 10; i++)
    {    
        p = mk_node(i);  // 调用函数 给值
        insert_node(p);  // 头插法
    }

    traverse();       //遍历
    scanf("%d",&target);
    p = search(target);
    if (p == NULL)
    {
      printf("can't find %d\n", target);
    }else
    {
      printf("%p %d %d\n",p, p-> data, target);
      rm_node(p);
      traverse();
      printf("%d\n",p->data);
      free_node(p);
    }

    destroy();
    traverse();

    return 0;
}

4.逆序

void reverse()
{
    node *p;
    node *nhead = head;
    head = NULL ;

    while ( nhead != NULL)
    {
        p = nhead;
        nhead = nhead -> next;

        insert_node(p);
    }
}

5.头节点链表

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

//头结点链表 

typedef struct node  //定义结构体
{
    int data;
    struct node *next;
}node;

node sentinel  = {0,NULL};   //初始化
node *head = &sentinel;      

node *mk_node(int item)   //   分配空间
{
    node*p = (node *)malloc(sizeof(node)); // 分配空间 (node *)强制类型转换
    if (p == NULL)
    {
        printf("malloc failed\n");
        exit(1);
    }

    p -> data = item;  // 初始化
    p -> next = NULL;

    return p;  //返回节点地址
}

void free_node(node *p)  //释放节点函数 谁申请 谁释放
{
    free(p);
    p = NULL;
}

void insert_node(node *p)  // 头节点
{
    p -> next = head -> next;
    head -> next= p;
}

void insert_node_l2b(node *p)  //插入排序
{
    node *pre = head;

    while(pre ->next != NULL)
    {
       if (pre->next->data >= p->data)
       {
           break;
       }
       pre = pre ->next;
    }

    p ->next =pre->next;
    pre ->next = p;
}

void traverse()  //遍历
{ 
    node *p = head -> next;

    while( p != NULL)
    {
        printf ("%d ",p -> data);
        p = p -> next;
    }
    printf ("\n");
}

node *search(int target)  //查找  
{ 
    node *p = head -> next;

    while( p != NULL)
    {
        if (p->data  == target)
        {
            return p;
        }
        p = p ->next;
    }
    return NULL;
}

void rm_node(node *p)   //删除
{
    

    node *pre = head;  //从头结点的下一个节点开始删除

    while (pre->next != NULL) 
    {
        if (pre->next == p)
        {
            pre->next = p->next; // 直接跳过删除目标
            p->next = NULL;
            return;
        }
        pre = pre->next;
     }

}

void destroy()  // 销毁节点
{
    node *p;

    while (head -> next != NULL)
    {
      p = head -> next;
      head -> next = p->next;
      free_node(p);
    }
}

void reverse()  //逆序
{
    node *p;
    node *nhead = head -> next;
    head -> next= NULL ;

    while ( nhead != NULL)
    {
        p = nhead;
        nhead = nhead -> next;

        p->next = NULL;
        insert_node(p);
    }
}

int main()
{

    node *p;
    int i;
    int target;
    int data;
    srand(time(NULL));

    for (i = 1; i < 10; i++)
    {    
        data = rand() % 100 + 1;  //随机数
        p = mk_node(data);  // 调用函数 给值
        insert_node_l2b(p);  // 
    }

    traverse();       //遍历
    scanf("%d",&target);
    p = search(target);
    if (p == NULL)
    {
      printf("can't find %d\n", target);
    }else
    {
      printf("%p %d %d\n",p, p-> data, target);
      rm_node(p);
      traverse();
      printf("%d\n",p->data);
      free_node(p);
    }
    reverse();
    traverse();

    destroy();
    traverse();

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值