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

    一、线性表的特性

      1、线性结构的特性

      (1)集合中必存在唯一的“第一元素”和唯一的“最后元素”。

      (2)除最后一个元素之外,均有唯一的后继和唯一的前驱。

      2、线性表的基本操作过程

      (1)用 Setnull(L)置空表;

      (2)用Length(L)求表的长度和表中各元素的个数;

      (3)用Get(L,i)获取表中的第i个元素(1=<i<=n);

      (4)用Prior(L,i)获取i的前驱元素;

      (5)用Next(L,i)获取i的后继元素;

      (6)用Locate(L,x)返回指定元素在表中的位置;

      (7)用Insert(L,i,x)插入新元素;

      (8)用Delete(L,x)删除已存在的元素;

      (9)用Empty(L)来判断是否为空。

      3、线性表的结构特点

      均匀性、有序性。

    二、顺序表操作

      线性表的基本操作过程如下:

      (1)计算顺序表的长度

    public int GetLength()
    {
        return last + 1;   //顺序表的长度就是数组最后一个元素的索引last加1
    }

      (2)清空操作

    public void Clear()
    {
        return last = - 1;//清空所有元素,此时last=-1
    }

      (3)判断线性表是否为空

    public bool IsEmpty()
    {
        if (last==-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

      (4)判断线性表是否为满

    public bool IsFull()
    {
        if (last==maxsize-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

      (5)附加操作

    public void Append(T item)
    {
        if (IsFull())
        {
            Console.WriteLine("List is full");//在末尾加元素
        }
        data[++last] = item;
    }

      (6)插入操作

    public void Insert(T item, int i)
    {
        //判断顺序表是否已满
        if(IsFull())
        {
            Console.WriteLine("List is full");
            return;
        }
        //判断插入的位置是否正确,
        //i小于1表示在第1个位置之前插入
        //i小于last+2表示在最后一个元素后面的第2个位置插入。
        if (i<1||i>last+2)
        {
            Console.WriteLine("Position is error!");
            return;
        }
        //在顺序表的表尾插入数据元素
        if (i==last+2)
        {
            data[i - 1] = item;
        }
        else   //在表的其他位置插入数据元素
        {
            //元素移动
            for (int j = last; j >= i - 1;--j)
            {
                data[j + 1] = data[j];
            }
            //将新的数据元素插入到第i个位置上
            data[i - 1] = item;
        }
        //修改表长
        ++last;
    }

    (7)删除操作

    public T Delete(int i)
    {
        T tmp = default(T);
        //判断表是否为空
        if (IsEmpty())
        {
            Console.WriteLine("List is empty");
            return tmp;
        }
        //判断删除的位置是否正确
        //i小于1表示删除1个位置之前的元素
        //i大于last+1表示删除最后一个元素后面的第1个位置的元素
        if (i<1||i>last+1)
        {
            Console.WriteLine("Position is error!");
            return tmp;
        }
        //删除的是最后一个元素
        if (i==last+1)
        {
            tmp = data[last--];
            return tmp;
        }
        else  //删除的不是最后一个元素
        {
            //元素移动
            tmp = data[i - 1];
            for (int j = i; j <= last;++j)
            {
                data[j] = data[j++];
            }
        }
        //修改表长
        --last;
        return tmp;
    }

      (8)获取元素

    public T GetElem(int i)
    {
        if (IsEmty()||(i<1) || (i>last + 1))
        {
            Console.WriteLine("List is Empty or Position is error!");
            return default(T);
        }
        return data[i - 1];
    }

      (9)按值查找

    public int Locate(T value)
    {
        //顺序表为空
        if (IsEmty())
        {
            Console.WriteLine("List is Empty!");
            return -1;
        }
        int i = 0;
        //循环处理顺序表
        for (i = 0; i <= last;++i)
        {
            //顺序表中存在与给定值相等的元素
            if (values.Equals(data[i])
            {
                break;
            }
        }
        //顺序表中不存在与给定值相等的元素
        if (i>last)
        {
            return -1;
        }
        return i;
    }

    三、链表操作

      创建链表CreateLinkList(int n)、插入节点insertList(LinkList *list,LinkList q,ElemType e)、删除节点delLink(Link *list,LinkList r,LinkList q)、销毁链表destory(LinkList *list)

    四、实例演练

      (1)顺序表的实例

      代码实现:

      1 #include "malloc.h"
      2 #include "conio.h"
      3 #include "stdlib.h"
      4 #define LIST_INIT_SIZE 10
      5 #define LISTINCREMENT 10
      6 #define ERROR 0
      7 #define OK 1
      8 #define OVERFLOW -2
      9 
     10 typedef struct 
     11 {
     12     int *elem;
     13     int length;
     14     int listsize;
     15 }SqList;//定义线性表结构体
     16 
     17 //初始化链表
     18 int InitList_Sq(SqList *L) //括号中传递的参数是它的指针,只有这样才能改变它的指向的元素。
     19 {
     20     int i;
     21     L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
     22     if (!L->elem)
     23     {
     24         exit(OVERFLOW);
     25     }
     26     L->length = 10;
     27     L->listsize = LIST_INIT_SIZE;//分配初始的空间
     28     for (i = 0; i < L->length;i++)
     29     {
     30         L->elem[i] = i;
     31     }
     32     return OK;
     33 }//InitList_Sq
     34 
     35 //求表长
     36 int get_length(SqList *L)
     37 {
     38     return L->length;
     39 }
     40 
     41 //销毁线性表
     42 int destroy(SqList *L)
     43 {
     44     L->length = 0;
     45     return OK;
     46 }
     47 
     48 //插入元素
     49 int ListInsert_Sq(SqList *L, int i, int e)
     50 {
     51     //在顺序表中的第i个位置之前插入新的元素e
     52     //i的合法位置为1<=i<=ListLength_Sq(L)+1
     53     int *newbase, *q, *p;
     54     if (i<1||i>L->length+1)
     55     {
     56         return ERROR;
     57     }
     58     if (L->length>=L->listsize)
     59     {
     60         //当前存储空间已满,增加分配
     61         newbase = (int *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(int));
     62         if (!newbase) //存储空间分配失败
     63         {
     64             exit(OVERFLOW);
     65         }
     66         L->elem = newbase;
     67         L->listsize += LISTINCREMENT;
     68     }
     69     q = &(L->elem[i - 1]);
     70     for (p = &(L->elem[L->length - 1]); p >= q;--p)
     71     {
     72         //插入位置及之后的元素右移
     73         *(p + 1) = *p;
     74     }
     75     *q = e;
     76     ++L->length;
     77     return OK;
     78 }
     79 
     80 
     81 //删除元素
     82 int ListDelete_Sq(SqList *L, int i, int e)
     83 {
     84     //在顺序表中的删除第i个位置的元素e,并用e返回其值。
     85     //i的合法位置为1<=i<=ListLength_Sq(L)
     86     int *q, *p;
     87     if (i<1 || i>L->length) //i值不合法
     88     {
     89         return ERROR;
     90     }
     91     p = &(L->elem[i - 1]); //被删除元素的位置
     92     e = *p;
     93     q = L->elem + L->length - 1; //表尾元素的位置
     94     for (++p; p <= q; ++p)
     95     {
     96         //插入位置及之后的元素左移
     97         *(p - 1) = *p;
     98     }
     99     --L->length; //表长减1
    100     return OK;
    101 }
    102 
    103 //显示所有元素
    104 int display_all(SqList *L)
    105 {
    106     int i;
    107     for (i = 0; i < L->length;i++)
    108     {
    109         printf("%d", L->elem[i]);
    110         printf(" ");
    111     }
    112     return OK;
    113 }
    114 
    115 int main()
    116 {
    117     SqList L;
    118     int get=0, e = 0;
    119     int i, num;
    120     InitList_Sq(&L);
    121     do
    122     {
    123         printf("请输入你要进行的操作序号
    ");
    124         printf("1,线性表置空
    ");
    125         printf("2,求线性表长度
    ");
    126         printf("3,数据元素的插入操作
    ");
    127         printf("4,数据元素的删除操作
    ");
    128         printf("5,显示线性表中的全部元素
    ");
    129         printf("6,退出
    ");
    130         scanf("%d", &get);
    131         switch (get)
    132         {
    133         case 1:
    134             destroy(&L); //将顺序表置空,只需要将其长度置零
    135             break;
    136         case 2:
    137             printf("该线性表的长度是%d
    ", get_length(&L));//求取线性表的长度
    138             break;
    139         case 3:
    140             //在指定的位置插入元素
    141             printf("请输入你要插入元素的位置(即在第i个元素之前插入)以及插入元素
    ");//求取线性表的长度
    142             scanf("%d,%d", &i, &num);
    143             ListInsert_Sq(&L, i, num);
    144             printf("新的线性表是
    ");
    145             display_all(&L);
    146             break;
    147         case 4:
    148             //删除指定的位置的元素
    149             printf("请输入你要删除元素的位置(即删除第i个元素)
    ");//求取线性表的长度
    150             scanf("%d,%d", &i);
    151             ListDelete_Sq(&L, i, e);
    152             printf("新的线性表是
    ");
    153             display_all(&L);
    154             break;
    155         case 5:
    156             //显示线性表所有的元素
    157             display_all(&L);
    158             printf("
    ");
    159             break;
    160         case 6:
    161             break;
    162         }
    163         
    164     } while (get != 6);
    165     system("pause");
    166     return OK;
    167 }
    顺序表Demo

       实现结果:

  • 相关阅读:
    加载数据量大,页面卡死解决办法
    [存档]开启window7的隐藏功能虚拟wifi
    IIS发布Asp.Net网站注意事项
    [转载]总结几种C#窗体间通讯的处理方法
    调整和删除Win7休眠文件Hiberfil.sys的方法技巧,释放系统空间! ...
    [存档]Div+Css布局中经常使用的小技巧合集
    Android AndroidManifest.xml 结构详解
    Android权限详细说明
    Activity 生命周期详解
    程序员的文采
  • 原文地址:https://www.cnblogs.com/hxf175336/p/9861309.html
Copyright © 2011-2022 走看看