Java算法(链表操作实例)

来源:互联网 发布:手机超星怎么看网络课 编辑:程序博客网 时间:2024/05/16 06:55

Java算法(链表操作实例)


代码:

package com.xu.main;

import java.util.Scanner;

public class P3_1 {

 /**
  * @功能:链表操作实例
  * @作者:
  * @日期:2012-10-15
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  CLType node,head = null;
  CLType CL = new CLType();
  String key,findkey;
  Scanner input = new Scanner(System.in);
  System.out.println("链表测试。先输入链表中的数据,格式为:关键字     姓名     年龄");
  do{
   DATA nodeData = new DATA();
   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.println("演示插入结点,输入插入位置的关键字:");
  findkey = input.next();
  System.out.println("输入插入结点的数据(关键字      姓名     年龄):");
  DATA nodeData = new DATA();
  nodeData.key = input.next();
  nodeData.name = input.next();
  nodeData.age = input.nextInt();
  head = CL.CLInsertNode(head, findkey, nodeData);  //插如结点
  CL.CLAllNode(head);          //显示
  
  System.out.println("演示删除结点,输入要删除的关键字:");
  key = input.next();
  CL.CLDeleteNode(head, key);
  CL.CLAllNode(head);
  
  System.out.println("演示在链表中查找,输入查找关键字:");
  key = input.next();
  node = CL.CLFindNode(head, key);
  if(node != null)
  {
   nodeData = node.nodeData;
   System.out.printf("关键字%s对应的结点为(%s,%s,%d)",key,nodeData.key,nodeData.name,nodeData.age);
   
  }
  else
  {
   System.out.printf("在链表中未找到关键字为%s的结点!",key);
  }
  
 }

}

class DATA {
 String key; // 关键字
 String name;
 int age;
}

class CLType // 定义链表结构
{
 DATA nodeData = new DATA();
 CLType nextNode;

 @SuppressWarnings("unused")
 CLType CLAddEnd(CLType head, DATA nodeData) // 追加结点
 {
  CLType node, htemp;
  if ((node = new CLType()) == null) {
   System.out.println("申请内存失败!");
   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;
  }

 }
 
 @SuppressWarnings("unused")
 CLType CLAddFirst(CLType head,DATA nodeData)  //在头结点增加结点
 {
  CLType node;
  if((node = new CLType()) == null)
  {
   System.out.println("申请内存失败!");
   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;
 }
 
 @SuppressWarnings("unused")
 CLType CLInsertNode(CLType head,String findkey,DATA nodeData) //插入结点
 {
  CLType node,nodetemp;
  if((node = new CLType())==null)    //分配内存结点的内容
  {
   System.out.println("申请内存 失败!");
   return null;
   
  }
  node.nodeData = nodeData;     //保存结点中的数据
  nodetemp = CLFindNode(head,findkey);
  if(nodetemp!=null)       //若找到要插入的结点
  {
   node.nextNode = nodetemp.nextNode;  //新插入结点指向关键结点的下一节点
   nodetemp.nextNode = node;    //设置关键结点指向新插入结点
   
  }
  else
  {
   System.out.println("未找到正确的插入位置!");
   //free(node);        //释放内存
  }
  return head;
  
 }
 
 int CLDeleteNode(CLType head,String key)   //删除结点
 {
  CLType node,htemp;
  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;
  DATA 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;
  }
 }
}


运行结果:


原创粉丝点击