工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2273|回复: 23

[原创]数据结构学习笔记之一:链表

[复制链接]
发表于 2005-11-26 20:34 | 显示全部楼层 |阅读模式
大四了,忙着找工作.凭着三年的项目实践经验,本以为工作不会太难找...但是,事与愿违,我在这场找工作的战役中却屡战屡败,总结其原因,最大最根本的是我基础不足,甚至是没有基础.晕,大四找工作的时候我才来恶补基础,真后悔以前对基础的排斥和不重视.

为了找份好工,也只能好好的恶补基础了.

数据结构首当其冲,下面我就将我数据结构的学习笔记share一下.(唉,人家大二学的东西,我现在才来学,不得不说是种悲哀)...
发表于 2005-11-26 20:37 | 显示全部楼层
让我来检查一下你的学习成果.

哈哈
回复

使用道具 举报

 楼主| 发表于 2005-11-26 20:38 | 显示全部楼层
许多人都知道链表(C语言)都是借助指针来实现链接的,同样许多人也知道java语言是没有指针的,所以很多人可能很理所当然的认为"java没有数据结构",我想这种想法是错误的.程序=算法+数据结构,任何语言都离不开数据结构(唉,这么简单一个道理我也是最近才悟出的,惭愧啊...).下面我就谈谈java语言的数据结构.
回复

使用道具 举报

 楼主| 发表于 2005-11-26 20:43 | 显示全部楼层
代码一:链表结构的java实现



  1. /*
  2. * 创建日期 2005-11-26
  3. * @author Woden Wang
  4. */
  5. package listtest;

  6. public class ListNode {
  7.        
  8.         Object element;
  9.         ListNode next;
  10.                
  11.         ListNode(Object o,ListNode n)
  12.         {
  13.                 element=o;
  14.                 next=n;
  15.         }
  16.        
  17.         ListNode(Object o)
  18.         {
  19.                 this(o,null);
  20.         }
  21. }
复制代码

[ Last edited by wool王 on 2005-11-26 at 12:59 ]
回复

使用道具 举报

 楼主| 发表于 2005-11-26 20:46 | 显示全部楼层
代码二:链表操作器的java实现


  1. /*
  2. * 创建日期 2005-11-26
  3. * @author Woden Wang
  4. */
  5. package listtest;

  6. public class LinkedList {

  7.         private ListNode header;
  8.        
  9.         LinkedList()
  10.         {
  11.                 header=new ListNode(null);
  12.         }
  13.        
  14.         LinkedList(ListNode n)
  15.         {
  16.                 header=new ListNode(null,n);
  17.         }
  18.        
  19.         /**
  20.          * 判断链表是否为空
  21.          * @return 链表是否为空的布尔值
  22.          */
  23.         boolean isEmpty()
  24.         {
  25.                 return header.next==null;
  26.         }
  27.        
  28.         /**
  29.          * 清空链表.
  30.          * 注:此方法没有真正清除内存,清楚内存的任务交给java垃圾回收器去处理吧.^_^
  31.          */
  32.         void makeEmpty()
  33.         {
  34.                 header=null;
  35.                 System.gc();
  36.         }
  37.        
  38.         /**
  39.          * 查找目标数据所在节点
  40.          * @param o 目标数据
  41.          * @return 保存目标数据节点
  42.          */
  43.         ListNode find(Object o)
  44.         {
  45.                 if(isEmpty())
  46.                         return null;
  47.                
  48.                 ListNode node = header.next;
  49.                 while(node!=null)
  50.                 {
  51.                         if(node.element.equals(o))
  52.                                 return node;
  53.                        
  54.                         node=node.next;
  55.                 }
  56.                 return null;
  57.         }
  58.        
  59.         /**
  60.          * 在节点node后面新建一个节点,该节点保存数据o
  61.          * @param o 数据
  62.          * @param node 插入节点
  63.          */
  64.         void insert(Object o,ListNode node)
  65.         {
  66.                 node.next=new ListNode(o,node.next);
  67.         }
  68.        
  69.         /**
  70.          * 删除目标数据的节点
  71.          * @param o 目标数据
  72.          */
  73.         void remove(Object o)
  74.         {
  75.                 if(isEmpty())
  76.                         return;
  77.                
  78.                 ListNode node = header.next;
  79.                 while(node!=null)
  80.                 {
  81.                         if(node.next.element.equals(o))
  82.                         {
  83.                                 node.next=node.next.next;
  84.                                 return;
  85.                         }
  86.                         node = node.next;
  87.                 }
  88.         }
  89. }
复制代码

[ Last edited by wool王 on 2005-11-26 at 12:59 ]
回复

使用道具 举报

 楼主| 发表于 2005-11-26 20:51 | 显示全部楼层
完成...参考了<数据结构(C语言版)>(hjack借我D书,呵呵,沾点仙气)和<数据结构与算法分析--java语言描述>,不过感觉原作者写得罗嗦了点,所以自己整理了下(原著的java实现用了3个类,我觉得有点不必要).
回复

使用道具 举报

 楼主| 发表于 2005-11-26 21:02 | 显示全部楼层
接下来用链表解一道题.这道题是我去北电笔试的时候遇到的,当时做得乱七八糟(因为要求用C/C++做...晕...当时就投降了...).

题目是这样的:输入一串字符,分别统计各个字符的数目.(maybe大家都觉得很简单,,,但我当时确实不会...用力鄙视我吧...)
回复

使用道具 举报

发表于 2005-11-26 21:25 | 显示全部楼层
楼主注释得很清楚.
之前没有看过JAVA的链表.
但都很容易看懂了.
下面这个函数小弟没用过
System.gc();//功能是什么?

[ Last edited by dy.f on 2005-11-26 at 21:46 ]
回复

使用道具 举报

发表于 2005-11-26 21:27 | 显示全部楼层
学得还不错,赞一下。

上述代码应该没有问题的,等你的实例出来再研究一下。
回复

使用道具 举报

 楼主| 发表于 2005-11-26 21:32 | 显示全部楼层
这题用了三个文件,其中两个分别是链表结构和链表操作器.

文件一:ListNode.java

  1. package list;


  2. public class ListNode {
  3.        
  4.         char element;        //当前字符
  5.         int count;                //字符个数

  6.         ListNode next;
  7.        
  8.         ListNode(char c,ListNode n)
  9.         {
  10.                 element = c;
  11.                 count=1;
  12.                 next=n;
  13.         }
  14.        
  15.         ListNode(char c)
  16.         {
  17.                 this(c,null);
  18.         }
  19. }
复制代码


文件二:LinkedList.java

  1. package list;


  2. public class LinkedList {

  3.         ListNode header;
  4.        
  5.         LinkedList()
  6.         {
  7.                 this(null);
  8.         }
  9.        
  10.         LinkedList(ListNode n)
  11.         {
  12.                 header=new ListNode(' ',n);
  13.         }
  14.        
  15.         boolean isEmpty()
  16.         {
  17.                 return header.next==null;
  18.         }
  19.        
  20.         void makeEmpty()
  21.         {
  22.                 header=null;
  23.         }
  24.        
  25.         ListNode find(char c)
  26.         {
  27.                 if(isEmpty())
  28.                         return null;
  29.                
  30.                 ListNode node = header.next;
  31.                 while(node!=null)
  32.                 {
  33.                         if(node.element==c)
  34.                                 return node;
  35.                        
  36.                         node=node.next;
  37.                 }
  38.                 return null;
  39.         }
  40.        
  41.         void insert(char c,ListNode node)
  42.         {
  43.                 node.next=new ListNode(c,node.next);
  44.         }
  45.        
  46.         void remove(char c)
  47.         {
  48.                 if(isEmpty())
  49.                         return;
  50.                
  51.                 ListNode node = header.next;
  52.                 while(node!=null)
  53.                 {
  54.                         if(node.next.element==c)
  55.                         {
  56.                                 node.next=node.next.next;
  57.                                 return;
  58.                         }
  59.                         node = node.next;
  60.                 }
  61.         }
  62. }
复制代码


文件三:Test.java

  1. package list;


  2. public class Test {
  3.        
  4.         public static void showCharCount(char s[])
  5.         {
  6.                 System.out.println("原字符串是:"+new String(s));
  7.                 LinkedList list = new LinkedList();
  8.                 ListNode node;
  9.                 for(int i=0;i<s.length;i++)
  10.                 {
  11.                         if((node=list.find(s[i]))==null)
  12.                                 list.insert(s[i],list.header);
  13.                         else
  14.                                 node.count++;                               
  15.                 }
  16.                
  17.                 /*
  18.                  * 打印链表
  19.                  */
  20.                 node = list.header.next;
  21.                 while(node!=null&&!list.isEmpty())
  22.                 {
  23.                         System.out.println("字符:  '"
  24.                                         +node.element+"'    出现:  "
  25.                                         +node.count+"  次");
  26.                         node=node.next;
  27.                 }
  28.         }
  29.        
  30.         public static void showCharCount(String s)
  31.         {
  32.                 showCharCount(s.toCharArray());
  33.         }

  34.         public static void main(String[] args) {

  35.                 showCharCount("abcd ssd wool");

  36.         }
  37. }

复制代码

[ Last edited by wool王 on 2005-11-26 at 13:34 ]
回复

使用道具 举报

 楼主| 发表于 2005-11-26 21:41 | 显示全部楼层
最后修饰下,把main方法写漂亮点:

  1.         public static void main(String[] args) throws IOException{

  2.                 String s;
  3.                 while(true)
  4.                 {
  5.                         System.out.print("请输入待统计字符串:  ");
  6.                         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  7.                         s = br.readLine();
  8.                        
  9.                         if(s.length()>=40)
  10.                         {
  11.                                 System.out.println("请输入40个字符以内.");
  12.                                 System.out.println("===============================\n");
  13.                                 continue;
  14.                         }
  15.                         else
  16.                                 break;                       
  17.                 }
  18.                 showCharCount(s);

  19.         }
复制代码
回复

使用道具 举报

 楼主| 发表于 2005-11-26 21:44 | 显示全部楼层
效果如下:

请输入待统计字符串:  Woden!Never give up!!!I'll do my best!!!
请输入40个字符以内.
===============================

请输入待统计字符串:  Woden!Never give up!!!
原字符串是:Woden!Never give up!!!
字符:  'p'    出现:  1  次
字符:  'u'    出现:  1  次
字符:  'i'    出现:  1  次
字符:  'g'    出现:  1  次
字符:  ' '    出现:  2  次
字符:  'r'    出现:  1  次
字符:  'v'    出现:  2  次
字符:  'N'    出现:  1  次
字符:  '!'    出现:  4  次
字符:  'n'    出现:  1  次
字符:  'e'    出现:  4  次
字符:  'd'    出现:  1  次
字符:  'o'    出现:  1  次
字符:  'W'    出现:  1  次
回复

使用道具 举报

 楼主| 发表于 2005-11-26 22:00 | 显示全部楼层
Originally posted by dy.f at 2005/11/26 13:25:
楼主注释得很清楚.
之前没有看过JAVA的链表.
但都很容易看懂了.
下面这个函数小弟没用过
System.gc();//功能是什么?

[ Last edited by dy.f on 2005-11-26 at 21:46 ]



那个是垃圾回收的方法...调用这个方法会建议java垃圾搜集器开始垃圾收集...
回复

使用道具 举报

发表于 2005-11-26 22:31 | 显示全部楼层
well done, wool
回复

使用道具 举报

发表于 2005-11-26 22:45 | 显示全部楼层
thx 13楼即楼主

[ Last edited by dy.f on 2005-11-26 at 23:02 ]
回复

使用道具 举报

发表于 2005-11-27 01:42 | 显示全部楼层
先定义结果体

typedef struct LNode{
        char data;                //字符
        int count;                //字符的数目
        struct LNode *next;
}LNode,*LinkList;

[ Last edited by dy.f on 2005-11-27 at 01:45 ]
回复

使用道具 举报

发表于 2005-11-27 01:46 | 显示全部楼层
/*函数功能:将元素c插到链表L的末尾
*
*/
void ListInsert(LinkList L,char c){

        LinkList q;
        LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点
        s->data = c;
        s->count = 1;
        s->next = NULL;
        q = L;
        while(q->next)q = q->next;
        q->next = s;
        s->next = NULL;
}
回复

使用道具 举报

发表于 2005-11-27 01:47 | 显示全部楼层
/*函数功能:判断元素是否在链表中,如在,该元素的个数加1,否则,把该元素插入到该链表的末尾
*
*/
void find(LinkList L,char c){
        LinkList p ;
        p = L;
        while(p->next){
                if(p->next->data == c){
                        p->next->count++;break;  //统计相同字符的个数
                }
                else
                        p = p->next;
        }
        if(p->next == NULL)        //字符c不在链表L中,把它插到链表后面
                ListInsert(L,c);  
}

[ Last edited by dy.f on 2005-11-27 at 19:12 ]
回复

使用道具 举报

发表于 2005-11-27 01:48 | 显示全部楼层
// charcount.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace::std;


typedef struct LNode{
        char data;                //字符
        int count;                //字符的数目
        struct LNode *next;
}LNode,*LinkList;

/*全局变量
*/
static LinkList L;

/*函数功能:将元素c插到链表L的末尾
*
*/
void ListInsert(LinkList L,char c){

        LinkList q;
        LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点
        s->data = c;
        s->count = 1;
        s->next = NULL;
        q = L;
        while(q->next)q = q->next;
        q->next = s;
        s->next = NULL;
}
/*函数功能:判断元素是否在链表中,如在,该元素的个数加1,否则,把该元素插入到该链表的末尾
*
*/
void find(LinkList L,char c){
        LinkList p ;
        p = L;
        while(p->next){
                if(p->next->data == c){
                        p->next->count++;break;  //统计相同字符的个数
                }
                else
                        p = p->next;
        }
        if(p->next == NULL)
                ListInsert(L,c);
}


/*函数功能:输入一串字符串,分别统计个各个字符的数目
*
*/
int _tmain(int argc, _TCHAR* argv[])
{
        LinkList list;
        char string[] = "helloworld";
        L = (LinkList)malloc(sizeof(LNode));//先建立一个带头结点的单链表
        L->next = NULL;
        for(int i = 0;i<sizeof(string); i++)
                find(L,string);
        list = L->next;
        while(list){
                cout<<list->data<<" number is:";
                cout<<list->count;
                list = list->next;
                cout<<endl;
        }

        cout<<endl<<"OK";
        return 0;
       
}
回复

使用道具 举报

发表于 2005-11-27 01:52 | 显示全部楼层
h number is:1
e number is:1
l number is:3
o number is:2
w number is:1
r number is:1
d number is:1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 06:52

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表