线性表

1.线性表是最基本,最简单,也是最常用的一种数据结构,线性表也就是 n 个元素组成的有限序列,有以下几个特征。

   对于一个非空的线性表,其逻辑结构如下。

  • 有一个开始结点a1没有直接前驱,有且仅有一个后继结点a2。
  • 有且仅有一个终结结点an,没有直接后继,有且仅有一个前驱结点a(n-1)。
  • 中间结点ai仅有一个前驱结点a(i-1)仅有一个后继结点a(i+1)。

2.线性表的运算

  • 初始化。

构造(InitList)一个空的线性表。

计算表长。

也就是(ListLength)计算表中结点个数。

  • 获取结点。

(GetNode)返回第i个结点的数据,0<=i<n-1。

  • 查找结点

(LocateNode)

查找值为x的结点并返回其在表中的位置,如果未找到则返回相应标志。

  • 插入结点(InsertList)

在相应位置插入结点,使得相应位置以后的结点位置+1,表的长度+1。

  • 删除结点

和插入操作相反,在特定位置删除结点,使得结点以后的结点位置-1,表的长度-1。

3.下面看一下具体实例(java版)

顺序存储

 1 package neuq.chao;
 2 import java.util.Scanner;
 3 class DATA{                                                //定义一个线性表存储的数据类型。
 4     String name;
 5     int    age;
 6 }
 7 
 8 public class LinerList {
 9     //线性表
10     static final int SIZE = 10;                            //定义线性表最大长度
11     
12     DATA[] lisData  = new DATA[SIZE+1];
13     int    Lislen;                                         //线性表已有结点长度
14     void InitList(LinerList l){
15         l.Lislen = 0;                                    //初始化线性表的长度为0
16     }
17     int listLength(LinerList l){
18                                                         //获取线性表的长度
19         return l.Lislen;
20     }
21     int insertList(LinerList l,int n,DATA data){       //在特定位置插入结点
22         if(l.Lislen>=SIZE){                            //线性表已满
23             System.out.print("线性表已满无法插入 
");
24             return 0;                                  //插入失败    
25         }    
26         if(n<1&&n>SIZE-1){                            //插入位置错位
27             System.out.print("插入序号错误: 
");
28         }
29         for(int i=l.Lislen;i>n;i--){                //n之后的结点依次向后移
30             l.lisData[i+1] = l.lisData[i];
31         }
32         l.lisData[n] = data;
33         l.Lislen++;
34         return 1;
35     }
36     int DeleteList(LinerList l,int n){
37         if(n<1&&n>l.Lislen+1){
38             System.out.print("要删除的结点序号不正确 
");
39             return 0;                                 //删除失败
40         }
41         for(int i=n;n<=l.Lislen;i++){
42             l.lisData[i-1] = l.lisData[i];          //n之后的结点依次向前移动
43         }
44         l.Lislen--;
45         return 1;                                    //删除成功
46     }
47  DATA getNode(LinerList l,int n){
48      if(n<1&&n>l.Lislen){
49          System.out.print("结点序号错误: 
");
50          return null;                                    //获取结点失败
51      }
52      else{
53          System.out.print("结点数据为: 
");
54          System.out.print(l.lisData[n].name+l.lisData[n].age);            //打印结点数据
55      }
56      return l.lisData[n];
57  }
58  int findNode(LinerList l,String name){        
59      int i;//通过name查找结点
60      for(i=1;i<=l.Lislen;i++){
61          if(!(l.lisData[i].equals(name))){
62              return i;                                                    //找到指定结点
63          }
64      }
65      return 0;
66  }
67  int showAll(LinerList l){
68      for(int i=1;i<=l.Lislen;i++){                                        //打印所有结点数据
69          System.out.printf("(%s,%d)
",l.lisData[i].name,l.lisData[i].age);
70      }
71      return 0;
72  }
73 }
74 class SList{
75     public static void main(String args[]){
76         Scanner input = new Scanner(System.in);
77         LinerList l = new LinerList();
78         System.out.print("顺序操作演示 
");
79         l.InitList(l);
80         System.out.print("初始化成功 
");
81         DATA data = new DATA();
82         System.out.print("输入要插入数据");
83         data.name = input.next();
84         data.age = input.nextInt();
85         int n    = input.nextInt();
86         if((l.insertList(l,n,data))!=0){                //插入操作演示
87             System.out.print("插入成功");
88         }
89     }
90 }
原文地址:https://www.cnblogs.com/code-changeworld/p/4361110.html