数据结构:使用单链表完成头插,尾删,打印,查找,删除等操作。

本文提供了一组C语言函数,用于操作单链表,包括创建链表、头插法插入节点、判断链表是否为空、在任意位置插入数据、尾插法插入、按值查找、按位置查找、头节点删除、尾节点删除、合并链表、按位置修改数据以及链表倒置。这些函数实现了链表基本操作的核心功能。
摘要由CSDN通过智能技术生成

单链表由一个个节点组成,节点包括数据域和指针域,数据域只保存数据值,指针域保存的是下一个节点的地址,如果要访问某一个节点,只要找到指向这个节点的指针域就行。实现代码如下:

seqlist.c

#include"seqlist.h"

//创建单链表,创建头结点
link *head_create()
{
    link *H = (link *)malloc(sizeof(link));
    if(H == NULL)
    {
        printf("内存申请失败!");
        return NULL;
    }else
    {
        //头结点初始化
        H->len = 0;
        H->next = NULL;
        return H;
    }
}

//创建结点函数
link *create_node()
{
    link *P = (link *)malloc(sizeof(link));
    if(P ==NULL)
    {
        printf("创建新结点失败!");
        return NULL;
    }else
    {
        return P;
    }
    
}

// 头插
void head_insert(link *H,int data)
{
   if(H == NULL)
   {
       printf("入参为空!");
       return;
   } 
   link * p = create_node();
   p->data = data;
   //断开旧的链接插入的结点
   p->next = H->next;
   H->next = p;
   H->len++;
}

//判空
int empty_link(link *H)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return -1;
   } 
   return H->next == NULL?1:0;
}

//任意位置插入数据
void insert_post_link(link *H,int data,int post)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   } 
   else if(post<=0 || post>H->len+1)
   {
       printf("位置不合理,请检查");
       return;
   }
   int i;
   link *p=H;
   //找到要插位置的前一个结点
   for(i=0;i<post-1;p=p->next,i++);
   link *new = create_node();
   //插入新结点
   new->data = data;
   new->next = p->next;
   p->next = new;
   H->len++;
}

//尾插
void insert_tail(link *H,int data)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   } 
   link *p = H->next;
   while(p->next!=NULL)
   {
       p = p->next;
   }
   link *new = create_node();
   new->data = data;
   new->next = p->next;
   p->next = new;
   H->len++; 
}

//按值查找
void serch_value(link *H,int data)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   } 
   link *p = H->next;
   while(p->next != NULL)
   {
      if(p->data == data)
      {
          printf("p->data:%d\n",p->data);
      }
      p = p->next;
   }
}

// 按位置查找
link *search_post(link *H,int post)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return NULL;
   } 
   if(post<=0 || post>H->len+1)
   {
     printf("位置不合理,请检查\n");
     return NULL;
   }
   link *p = H;
   int i;
   for(i=0;i<post;i++,p = p->next);
   return p;
}

//头删
void head_delete(link *H)
{
     if(H == NULL)
   {
       printf("入参为空!");
       return;
   }
   //判空
   if(empty_link(H))
   {
       printf("链表为空,请检查!\n");
       return;
   } 
   //定义一个指针来保存要删除的结点,便于释放 
   link *p = H->next;
   H->next =H->next->next;
   free(p);
   p = NULL;
   H->len--;
}

//尾删
void dele_tail(link *H)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   }
   //判空
   if(empty_link(H))
   {
       printf("链表为空,请检查!\n");
       return;
   }
   link *p = H;
   while(p->next->next !=NULL)
   {
       p = p->next;
   }
   free(p->next);
   p->next = NULL;
   H->len--;
}

//合并链表
void merge_link(link *H,link *H1)
{
    if(H == NULL || H1 == NULL)
    {
        printf("链表为空,请检查!\n");
        return;
    }
    link *p =H;
    while(p->next != NULL)
    {
        p = p->next;
    }
    H->len += H1->len;
    p->next = H1->next;
    free(H1);
    H1 = NULL;
}
//按位修改
void updata_post(link *H,int post,int data)
{
     link * p=search_post(H,post);
     if(p == NULL)
     {
        printf("err\n");
        return;
     }else
     {
         p->data = data;
     }

}

//链表倒置
void inversion_link(link *H)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   }
   link *p=H->next;
   H->next = NULL;
   link *k = NULL;
   while(p!=NULL)
   {
       k=p;
       p=p->next;
       k->next = H->next;
       H->next = k;
   }

}
//打印单链表
void printf_link(link *H)
{
    if(H == NULL)
   {
       printf("入参为空!");
       return;
   }
   link *p =H->next;
   while(p!=NULL)
   {
       printf("%d\n",p->data);
       p = p->next;
   }
}

seqlist.h

#ifndef __SEQ_LIST__
#define __SEQ_LIST__
#include <stdlib.h>
#include <stdio.h>
typedef struct listlink
{
    union 
    {
        int len;
        int data;
    };
    struct listlink *next;//指针指向下一个结点
}link;

//创建单链表,创建头结点
link *head_create();
//创建结点函数
link *create_node();
// 头插
void head_insert(link *H,int data);
//判空
int empty_link(link *H);
//任意位置插入数据
void insert_post_link(link *H,int data,int post);
//尾插
void insert_tail(link *H,int data);
//按值查找
void serch_value(link *H,int data);
// 按位置查找
link *search_post(link *H,int post);
//头删
void head_delete(link *H);
//尾删
void dele_tail(link *H);
//按位修改
void updata_post(link *H,int post,int data);
//合并链表
void merge_link(link *H,link *H1);
//链表倒置
void inversion_link(link *H);
//打印单链表
void printf_link(link *H);

#endif

main.c

#include<stdio.h>
#include"seqlist.h"

int main(int argc, char const *argv[])
{
    link *H =head_create();
    head_insert(H,10);
    head_insert(H,20);
    head_insert(H,30);
    insert_post_link(H,100,2);
    insert_tail(H,40);
    //serch_value(H,20);
    head_delete(H);
    dele_tail(H);

    link *H1 =head_create();
    head_insert(H1,60);
    head_insert(H1,70);
    head_insert(H1,80);
    merge_link(H,H1);
    updata_post(H,3,520);
    inversion_link(H);
    printf_link(H);
    printf("end\n");
    // link * p = search_post(H,3);
    // if(p == NULL)
    // {
    //     printf("按位查找失败!\n");
    // }else
    // {
    //     printf("p->data:%d\n",p->data);
    // }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值