C语言单链表完整简单示范

我们先实现一个简单的单链表的可添加数据和打印数据

#include "stdio.h"		
#include "stdlib.h"				//提供malloc()和free()
#include "string.h"				//提供strcpy()等

struct Node* head= NULL;
struct Node* end = NULL;

struct Node{
	int a;				//数据域
	struct Node* next;	//指针域(指向节点的指针)
};


//尾部添加
void add(int a )
{
		//创建一个节点
		struct Node* temp=(struct Node*)malloc(sizeof(struct Node));		//此处注意强制类型转换

		//节点数据进行赋值
		temp->a=a;
		temp->next=NULL;		
		
		//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
		if(NULL==head)
		{	
			head=temp;
		}
		else{
		//连续追加
		end->next=temp;
		}
		end=temp;			//尾结点应该始终指向最后一个
}
//打印所有
void print()
{
	struct Node *temp =head;		//定义一个临时变量来指向头
	while (temp !=NULL)
	{
		printf("%d\n",temp->a);
		temp = temp->next;		//temp指向下一个的地址 即实现++操作
	}

}
//运行
int main(){
	add(1);
	add(2);
	print();
	return 0;
}

接下来是完整的单链表所有功能演示,数据的头插入,尾插入,指定位置插入,和数据的头删除,尾删除,指定位置删除,和打印数据。

#include "stdio.h"		
#include "stdlib.h"				//提供malloc()和free()
#include "string.h"				//提供strcpy()等

struct Node* head= NULL;
struct Node* end = NULL;

struct Node{
	int a;				//数据域
	struct Node* next;	//指针域(指向节点的指针)
};


//尾部添加
void add(int a )
{
		//创建一个节点
		struct Node* temp=(struct Node*)malloc(sizeof(struct Node));		//此处注意强制类型转换

		//节点数据进行赋值
		temp->a=a;
		temp->next=NULL;		
		
		//连接分两种情况1.一个节点都没有2.已经有节点了,添加到尾巴上
		if(NULL==head)
		{	
			head=temp;
		}
		else{
		//连续追加
		end->next=temp;
		}
		end=temp;			//尾结点应该始终指向最后一个
}
//打印所有
void print()
{
	struct Node *temp =head;		//定义一个临时变量来指向头
	while (temp !=NULL)
	{
		printf("%d\n",temp->a);
		temp = temp->next;		//temp指向下一个的地址 即实现++操作
	}

}



//删除开头
void topdell(){

   if(NULL == head){
    printf("空");
    return ; 
    
    }else{
               
      head=head->next;
          
        }}




//删除结尾
void dell(){
    
    if(NULL == end){
    printf("空");
    return ;  
    }else{
      //地址相同
      struct Node* temp = head;    
      struct Node* temp2;             
      while(1){    
                   
         if(temp->next==NULL){  
         
            //释放最后一个
            free(temp);
            //上一个指向空
            temp2->next=NULL;           
            //end被重新定义新的结尾 
            end=temp2;            
        
            break; }
              //记住上一个指针
            temp2=temp;
              //指向下一个
           temp=temp->next;       
      
          }}
          
          
 }


//删除任意位置

void maxdell(int number){

 int key=0;
 if(head == end){
    printf("空");
    return ;  
    }else{
      //地址相同
      struct Node* temp = head;    
      struct Node* temp2;             
      while(1){    
      
         if(number==1){
         
         topdell();
         return;
         }
                   
         key++;
         if(key==number){               
            //间隔一位 
            temp2->next=temp->next;    
            //释放去掉的空间 
            //free(temp2);       
              
            break; }
            //记住上一个指针
            temp2=temp;
            //指向下一个
            temp=temp->next;       
            
         //超过最大时退出 
            if (temp->next==NULL  ){
            printf("不合法删除\n");
            break;
            
            }             
            
       
          }}



}



//开头添加
void topadd(int a )
{
        if(head==NULL){
        
        add(a);
        return;
        
        }
        

        //写好新的      	
	    struct Node* temp2=(struct Node*)malloc(sizeof(struct Node));		//此处注意强制类型转换
		temp2->a=a;
		temp2->next=head;	
        head=temp2;	
		

}


//任意位置添加 

void maxadd(int number,int data){

 int key=0;
 if(head == end){
    printf("空");
    return ;  
    }else{
      //地址相同
      struct Node* temp = head;    
      struct Node* temp2;             
      while(1){ 
      
            
      
         if(number==1){
         
         topadd(data);
         return;
         }
                   
         key++;
         if(key==number){               
 
      //写好新的      	
	    struct Node* temp3=(struct Node*)malloc(sizeof(struct Node));		//此处注意强制类型转换
		temp3->a=data;
        //拼接 
		temp3->next=temp;	
        temp2->next =temp3;
        
          
             
              
            break; }
            //记住上一个指针
            temp2=temp;
            //指向下一个
            temp=temp->next;   
            //超过最大时退出 
            if (temp->next==NULL  ){
            printf("不合法添加\n");
            break;
            
            }  
       
          }}



}




int main(int argc, char** argv){
   //添加数据
   add(5);   
   add(50);     
   add(55);    
   add(509); 
   //开头添加25
   topadd(25);
   //指定位置添加45
   maxadd(3,45);
   //删除开头 
   topdell();
   //删除结尾
   dell();
   //指定位置删除
   maxdell(2);
   //打印全部
   print();
   return 0;
  }



下面是我的几个联系方式:
在这里插入图片描述

我的b站视频作品首页:https://space.bilibili.com/650029439

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值