zoukankan      html  css  js  c++  java
  • 数据结构之线性表

    一:定义

    • 线性表(Linear List) :由同类型数据元素构成有序序列的线性结构
    • 表中元素个数称为线性表的长度
    • 线性表没有元素时,称为空表
    • 表起始位置称表头,表结束位置称表尾
    • 线性表的抽象数据类型描述
    • 类型名称:线性表(List)
    • 数据对象集:线性表是 n (≥0) 个元素构成的有序序列(a11​,a22​,…,ann​)
    • 操作集:线性表 L ∈ List,整数 i 表示位置,元素 X ∈ ElementType

    1:线性表的顺序存储实现

    注:顺序存储中是序号是下标,从 0 开始

    last【当成数组位置】
    0
    1
    2
    i
    1
    2
    3

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define ElementType int
     4 #define  MAXSIZE 10
     5 typedef struct Lnode *List;
     6 struct Lnode
     7 {
     8     ElementType Data[MAXSIZE];
     9     int last;
    10 };
    11 //建立空的顺序表
    12 List MakeEmpty()
    13 {
    14     List PtrL;
    15     PtrL = (List)malloc(sizeof(struct Lnode));
    16     PtrL->last = -1;
    17     return PtrL;
    18 }
    19 //查找
    20 int Find(ElementType X,List PtrL)
    21 {
    22     int i = 0;
    23     while(i<=PtrL->last && PtrL->Data[i]!=X)
    24     {
    25         i++;
    26     }
    27     if(i>PtrL->last)
    28     {
    29         return -1;
    30     }
    31     else
    32     {
    33         return i;
    34     }
    35 }
    36 void Insert(ElementType X,int i,List Ptrl)
    37 {
    38     int j;
    39     // 判断表满
    40     if(Ptrl->last == MAXSIZE -1 )
    41     {
    42         printf("表满");
    43         return;
    44     }
    45     //检查插入位置合法
    46     if(i < 1 ||  i > Ptrl->last + 2)
    47     {
    48         printf("位置不合法");
    49         return;
    50     }
    51     for(j = Ptrl->last;j>=i-1;j--)
    52     {
    53         Ptrl->Data[j + 1] = Ptrl->Data[j];
    54     }
    55     Ptrl->Data[i - 1] = X;
    56     Ptrl->last++;
    57     return;
    58 }
    59 void Delete(int i, List PtrL)
    60 {
    61     int j;
    62     if (i < 1 || i > PtrL->last +1)
    63     {
    64         printf("不存在第%d个元素",i);
    65         return;
    66     }
    67     for(j = i;j<=PtrL->last;j++)
    68     {
    69         PtrL->Data[j - 1] = PtrL->Data[j];
    70     }
    71     PtrL->last--;
    72     return;
    73 }
    View Code
    线性表的链式存储实现
    不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
    插入、删除不需要移动数据元素,只需要修改“链”。
    注:链式存储中是序号是下标,从 1 开始

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 typedef struct LNode* List;
      4 struct LNode
      5 {
      6     List next;
      7     ElementType data;
      8 };
      9 List MakeEmpty()
     10 {
     11     List PtrL = (List)malloc(sizeof(struct LNode));
     12     PtrL = NULL;
     13     
     14     return PtrL;
     15 }
     16 
     17 //求表长
     18 int ListLength(List Ptrl)
     19 {
     20     List temp = Ptrl;
     21     int j = 0;
     22     while(temp)
     23     {
     24         temp = temp->next;
     25         j++;
     26     }
     27     return j;
     28 }
     29 //按序号查找
     30 List FindKth(int k,List Ptrl)
     31 {
     32     int i = 1;
     33     List temp = Ptrl;
     34     while(temp && i < k)
     35     {
     36         temp = temp->next;
     37         i++;
     38     }
     39     if (i == k)
     40     {
     41         return temp;
     42     }else
     43     {
     44         return NULL;
     45     }
     46 }
     47 //按值查找
     48 List Find(ElementType x,List Ptrl)
     49 {
     50     List temp = Ptrl;
     51     while(temp!=NULL && temp->data!=x)
     52     {
     53         temp = temp->next;
     54     }
     55     if (temp)
     56     {
     57         return temp;
     58     }
     59     else 
     60         return NULL;
     61 
     62 }
     63 List Insert(ElementType X,int i ,List Ptrl)
     64 {
     65     List p, s;
     66     if(i == 1)
     67     {
     68         s = (List)malloc(sizeof(struct LNode));
     69         s->data = X;
     70         s->next = Ptrl;
     71         return s;
     72     }
     73     p = FindKth(i - 1, Ptrl);
     74     if(p == NULL)
     75     {
     76         printf("参数%d有误",i);
     77         return NULL;
     78     }
     79     else
     80     {
     81         s = (List)malloc(sizeof(struct LNode));
     82         s->data = X;
     83         s->next = p->next;
     84         p->next = s;
     85         return Ptrl;
     86     }
     87 }
     88 List Delete(int i,List PtrL)
     89 {
     90     List p, s;
     91     if(i == 1)
     92     {
     93         s = PtrL;
     94         if(PtrL!=NULL)
     95         {
     96             PtrL = PtrL->next;
     97         }
     98         else
     99         {
    100             return NULL;
    101         }
    102         free(s);
    103         return PtrL;
    104     }
    105     p = FindKth(i - 1 ,PtrL);
    106     if(p == NULL)
    107     {
    108         printf("第%d个节点不存在",i-1);
    109     }
    110     else if(p->next==NULL)
    111     {
    112         printf("第%d个节点不存在",i);
    113     }
    114     else
    115     {
    116         s = p->next;    //指向要删除的结点点
    117         p->next = s->next; //从链表中删除
    118         free(s); //释放删除的结点
    119         return PtrL;
    120     }
    121 }
    122 //Print
    123 void Print(List Ptrl)
    124 {
    125     List temp = Ptrl;
    126     while(temp)
    127     {
    128         printf("%d
    ",temp->data);
    129         temp = temp->next;
    130     }
    131 }
    View Code
  • 相关阅读:
    (转)三款Json查看小工具
    开源数据源
    关于异常
    java 线程池
    百度android面试及一些问题的讲解
    linux常用命令
    android activityManager
    Android ListView及其属性
    android listView与adapter
    android 反编译
  • 原文地址:https://www.cnblogs.com/Yzengxin/p/13995657.html
Copyright © 2011-2022 走看看