数据结构之线性表(一)

Posted on 2018-10-27 15:09  时光top  阅读(321)  评论(0编辑  收藏  举报

一、线性表的特性

  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("请输入你要进行的操作序号\n");
124         printf("1,线性表置空\n");
125         printf("2,求线性表长度\n");
126         printf("3,数据元素的插入操作\n");
127         printf("4,数据元素的删除操作\n");
128         printf("5,显示线性表中的全部元素\n");
129         printf("6,退出\n");
130         scanf("%d", &get);
131         switch (get)
132         {
133         case 1:
134             destroy(&L); //将顺序表置空,只需要将其长度置零
135             break;
136         case 2:
137             printf("该线性表的长度是%d\n", get_length(&L));//求取线性表的长度
138             break;
139         case 3:
140             //在指定的位置插入元素
141             printf("请输入你要插入元素的位置(即在第i个元素之前插入)以及插入元素\n");//求取线性表的长度
142             scanf("%d,%d", &i, &num);
143             ListInsert_Sq(&L, i, num);
144             printf("新的线性表是\n");
145             display_all(&L);
146             break;
147         case 4:
148             //删除指定的位置的元素
149             printf("请输入你要删除元素的位置(即删除第i个元素)\n");//求取线性表的长度
150             scanf("%d,%d", &i);
151             ListDelete_Sq(&L, i, e);
152             printf("新的线性表是\n");
153             display_all(&L);
154             break;
155         case 5:
156             //显示线性表所有的元素
157             display_all(&L);
158             printf("\n");
159             break;
160         case 6:
161             break;
162         }
163         
164     } while (get != 6);
165     system("pause");
166     return OK;
167 }
顺序表Demo

   实现结果:

 

Copyright © 2024 时光top
Powered by .NET 9.0 on Kubernetes