c语言链表的创建插入等操作

本文详细介绍了单链表的基本操作,包括链表的创建、节点的插入与删除、链表的输出与整表删除,以及如何通过代码实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码:

 

//单链表的建立,节点赋值,输出,插入,整表删除,指定节点位置删除 
#include <stdio.h>
#include <stdlib.h>
#define N 15  
struct student{
        int date;
        struct student *next;
    };  //节点结构体 
/***********************************************
单链表的创建函数: 
节点个数:1个头节点+n个子节点一共n+1个节点 
头结点数据域存放子节点个数,子节点数据域默认为0 
***********************************************/ 
struct student *creat(unsigned int n)
{
    struct student *head,*p,*s;
    head=p=s=NULL;
    int i=0;
    if((head=(struct student*)malloc(sizeof(struct student)))==NULL)
    {
        printf("head创建失败\n");
        return NULL; 
    }    
    head->date=n;
    s=head;
    for(i=0;i<n;i++)
    {
        if((p=(struct student*)malloc(sizeof(struct student)))==NULL)
        {
            printf("第%d个节点创建失败\n",i+1);
            return NULL; 
        }
        s->next=p; //保存下一个节点的指针域 
        s=p;       //移动到最后一个节点 
        s->date=0; //数据域初始值默认为0 
        }
        s->next=NULL; 
        return head;  //返回头节点指针 

/***********************************************
链表的整表删除函数: 
删除 n+1个节点 
***********************************************/ 
void DeList(struct student *p) //删除以p为头结点的链表 
{
    struct student *s=NULL;
    while(p!=NULL)
    {
        s=p;
        p=p->next; //p指针指向下一个节点
        free(s);   //删除s节点 
    }
 } 
 /***********************************************
 单节点删除函数: 
删除第 n个节点后的 m 个节点 
从 n节点后删除 m个节点 
***********************************************/ 
 void Del(struct student *list,int n,int m) 
{
    struct student *s=NULL,*p=NULL,*pt=NULL;
    int i=0;
    list->date=list->date-m;
    for(i=0;i<n;i++)
    {
        s=list->next;
    }
    p=s->next;
    for(i=0;i<m;i++)
    {
        pt=p->next;
        free(p);
        p=pt;
    }
    if(m+n==5) //删除到 最后一个节点 
    {
        s->next=NULL; 
    } 
    else
    {
        s->next=p;
    }
    
 }
 /***********************************************
 链表输出函数: 
输出链表头结点以及各个子节点的数据域以及指针域 

***********************************************/  
 void print(const struct student *p) 
 {
     int i=0;
     int len=p->date;
     printf("该链表除去头结点共有%d个子节点\n",p->date);
     for(i=0;i<len;i++)
     {
         p=p->next;
         printf("第%d个子节点  date:%d   next:%p\n",i+1,p->date,p->next);
         
     }
  } 
  /***********************************************
链表输入函数: 
将链表第n个位置后的m个节点以数组a中数据赋值到节点的数据域 
***********************************************/ 
  void scan(struct student *list,int n,int m,const int a[]) 
  {
          int i=0;
          struct student *p=NULL,*s=NULL; 
          if(m+n>list->date)
          {
              printf("写入数据个数超过节点个数\n");
              return ;
          } 
          s=list;
          for(i=0;i<n;i++) //将s指针移动到第n个节点处 
          {
              s=s->next;
        }
        s=s->next; //s节点指针指向将要赋值的节点 
        for(i=0;i<m;i++)
        {
            s->date=a[i];
            s=s->next; 
        } 
         
  }
  
  /***********************************************
链表插入函数: 
在链表第n个位置后插入m个节点 
***********************************************/ 

void insertion(struct student *list,int n,int m )  //在第n个节点后面插入m个节点 
{
    struct student *p=NULL,*s=NULL,*pt;
    int i=0;
    if(n>list->date)
    {
        printf("插入位置大于链表节点个数\n");
        return ;
    }
    pt=list;
    for(i=0;i<n;i++)
    {
        pt=pt->next; //移动到第n个节点处 
    }
    s=pt->next; 
    for(i=0;i<m;i++)
    {
        if((p=(struct student *)malloc(sizeof(struct student)))==NULL)
        {
            printf("节点创建失败\n",i+1);
            return ; 
        }
        p->date=0;
        pt->next=p;
        pt=p;
        list->date++; 
    }
    pt->next=s;    
    
        
}
int main(int argc, char *argv[]) 
{
    struct student *str=NULL;
    int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    str=creat(N); // 创建N个节点的单链表返回头节点指针
    scan(str,5,10,a);
    insertion(str,2,3);  //在第二个节点后插入子节点 
    print(str);        //输出链表信息 
    Del(str,5,3);     //第五个节点后删除3个节点 
    print(str);        //输出链表信息 
    DeList(str);     //删除链表 
    return 0; 


int main(int argc, char *argv[]) 
{
    struct student *str=NULL;
    int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    str=creat(N); // 创建N个节点的单链表返回头节点指针
    scan(str,5,10,a);
    insertion(str,2,3);  //在第二个节点后插入子节点 
    print(str);        //输出链表信息 
    Del(str,5,3);     //第五个节点后删除3个节点 
    print(str);        //输出链表信息 
    DeList(str);     //删除链表 
    return 0; 

测试环境dev c++:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值