• JAVA链表简单实现


    import java.util.Scanner;
    
    
    class DATA2
    {
        String key;  				//结点的关键字 
        String name;
        int age;
    } 
    
    class CLType								//定义链表结构
    {
        DATA2 nodeData=new DATA2();
        CLType nextNode;
        
        
      //追加结点 
        CLType CLAddEnd(CLType head,DATA2 nodeData)  	
        {
            CLType node,htemp;
            if((node=new CLType())==null)
            {
                System.out.print("申请内存失败!\n"); 
                return null;  							//分配内存失败 
            }
        	else
        	{
        		node.nodeData=nodeData; 				//保存数据 
        		node.nextNode=null;  				//设置结点指针为空,即为表尾 
        		if(head==null)  						//头指针 
        		{
        			head=node;
        			return head;
        		}
        		htemp=head;
        		while(htemp.nextNode!=null) 			//查找链表的末尾 
        		{
        			htemp=htemp.nextNode;
        		}
        		htemp.nextNode=node;
        		return head;
        	}
        }
    
        
        //添加头结点
        CLType CLAddFirst(CLType head,DATA2 nodeData) 
        {
            CLType node;
            if((node=new CLType())==null)
            {
                System.out.print("申请内存失败!\n"); 
                return null;  							//分配内存失败 
            }
        	else
        	{
        		node.nodeData=nodeData; 				//保存数据 
        		node.nextNode=head;  					//指向头指针所指结点 
        		head=node;        						//头指针指向新增结点
        		return head; 
        	}
        }
        
      //查找结点
        CLType CLFindNode(CLType head,String key) 		
        {
            CLType htemp;
            htemp=head;       							//保存链表头指针 
            while(htemp!=null)      							//若结点有效,则进行查找 
            {
                if(htemp.nodeData.key.compareTo(key)==0) 		//若结点关键字与传入关键字相同 
        		{
                    return htemp;  						//返回该结点指针 
        		}
                htemp=htemp.nextNode; 					//处理下一结点 
            }
            return null; 								//返回空指针 
        }
      //插入结点 
        CLType CLInsertNode(CLType head,String findkey,DATA2 nodeData)  	
        {
            CLType node,nodetemp;    
            if((node=new CLType())==null) 		//分配保存结点的内容 
            {
                System.out.print("申请内存失败!\n"); 
                return null;  								//分配内存失败 
            }
            node.nodeData=nodeData;  					//保存结点中的数据 
            nodetemp=CLFindNode(head,findkey);
            if(nodetemp!=null)  								//若找到要插入的结点 
            {
                node.nextNode=nodetemp.nextNode;  		//新插入结点指向关键结点的下一结点 
                nodetemp.nextNode=node;    			//设置关键结点指向新插入结点 
            }
        	else
        	{
                System.out.print("未找到正确的插入位置!\n"); 
    //            free(node);								//释放内存
            }
            return head;								//返回头指针
        }
    
        int CLDeleteNode(CLType head,String key)
        {
            CLType node,htemp; 						//node保存删除结点的前一结点 
            htemp=head; 
        	node=head;
            while(htemp!=null)
            {
                if(htemp.nodeData.key.compareTo(key)==0) 		//找到关键字,执行删除操作 
                {
                    node.nextNode=htemp.nextNode;  		//使前一结点指向当前结点的下一结点
    //                free(htemp);  						//释放内存 
                    return 1;
                }
        		else
        		{
                    node=htemp;  						//指向当前结点 
                    htemp=htemp.nextNode; 				//指向下一结点 
                }
             }
             return 0;									//未删除 
        }
    
        int CLLength(CLType head)						//计算链表长度
        {
            CLType htemp;
            int Len=0;
            htemp=head;
            while(htemp!=null)      							//遍历整个链表 
            {
                Len++; 								//累加结点数量 
                htemp=htemp.nextNode;					//处理下一结点 
            }
            return Len;									//返回结点数量 
        }
    
        void CLAllNode(CLType head) 					//遍历链表 
        {
            CLType htemp;
            DATA2 nodeData;
            htemp=head;
            System.out.printf("当前链表共有%d个结点。链表所有数据如下:\n",CLLength(head)); 
            while(htemp!=null) 								//循环处理链表每个结点 
            {
                nodeData=htemp.nodeData;				//获取结点数据 
                System.out.printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age); 
                htemp=htemp.nextNode;					//处理下一结点 
            }
        }
      
    }
    
    public class LinkedList {
    
    	public static void main(String[] args) {
    		CLType node, head=null;
    	    CLType CL=new CLType();
    	    String key,findkey;
    	    Scanner input=new Scanner(System.in);
    	    
    	    System.out.print("链表测试。先输入链表中的数据,格式为:关键字 姓名 年龄\n"); 
    	    do
    		{ 
    	    	DATA2 nodeData=new DATA2();
    	        nodeData.key=input.next();
    	       if(nodeData.key.equals("0")) 
    			{
    				break; //若输入0,则退出
    			}
    			else
    			{
    				nodeData.name=input.next();
    				nodeData.age=input.nextInt();
    				head=CL.CLAddEnd(head,nodeData);//在链表尾部添加结点
    			}
    	    }while(true);   
    	    CL.CLAllNode(head); 							//显示所有结点
    	 
    	    System.out.printf("\n演示插入结点,输入插入位置的关键字:") ;
    	    findkey=input.next();  						//输入插入位置关键字 
    	    System.out.print("输入插入结点的数据(关键字 姓名 年龄):");
    	    DATA2 nodeData=new DATA2();
    	    nodeData.key=input.next();
    	    nodeData.name=input.next();
    	    nodeData.age=input.nextInt();//输入插入结点数据 
    	    head=CL.CLInsertNode(head,findkey,nodeData);		//调用插入函数  
    	    CL.CLAllNode(head); 							//显示所有结点
    
    	    System.out.print("\n演示删除结点,输入要删除的关键字:");
    	     
    	    key=input.next();								//输入删除结点关键字 
    	    CL.CLDeleteNode(head,key); 					//调用删除结点函数 
    	    CL.CLAllNode(head); 							//显示所有结点   
    
    	    System.out.printf("\n演示在链表中查找,输入查找关键字:");
    	    key=input.next();							//输入查找关键字 
    	    node=CL.CLFindNode(head,key);					//调用查找函数,返回结点指针 
    	    if(node!=null)									//若返回结点指针有效 
    	    {
    	        nodeData=node.nodeData;				//获取结点的数据 
    	        System.out.printf("关键字%s对应的结点为(%s,%s,%d)\n" ,key,nodeData.key,nodeData.name,nodeData.age);        
    	    }
    		else										//若结点指针无效 
    		{
    	        System.out.printf("在链表中未找到关键字为%s的结点!\n",key); 
    		}
    
    	}
    
    }
    

      

  • 相关阅读:
    一段代码让你了解匿名函数的来龙去脉
    橡皮擦背景色橡皮擦魔术橡皮擦
    flv播放器
    测试面试题01
    java中堆和栈的区别
    经典javaThead 生产者 消费者
    判断一个点是否在三个点组成的三角形内 java 代码 面试经典
    软件项目管理面试题
    java中的位运算
    真正的JDBC java代码
  • 原文地址:https://www.cnblogs.com/elleniou/p/3096571.html
Copyright © 2020-2023  润新知