码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构——线性表之顺序表

时间:2017-09-08 20:41:07      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:范围   int   系统   数据   eof   查找   isp   size   amp   

定义顺序表是由一段连续的储存单元存储数据的一种简单的数据结构形式,其优点在于快速的查找存储单元的值,缺点在于

时间复杂度 :查找:O(1),插入和删除:O(n);

对于清华大学《数据结构》——做出自己的理解;(用实例来理解抽象的事物)

假设,一次期末的成绩考试完后,老师需要将同学们的成绩输入到学校的系统内部去,同时能够改写成绩,添加学生等操作。

ADT{

    数据对象      

typedef struct
{
	char Name[Len];//学生的名字
	int Grade;//成绩
}Student;

typedef struct//基本结构
{
	Student *elem;//存储单元地址
	int length;//当前长度
	int listsize;//预设长度
}Sqlist;

    基本操作:

      List_Init(Sqlist &L);//对链表初始化

技术分享
void List_Init(Sqlist &L)
{
    L.elem = (Student*)(malloc(LIST_SIZE * sizeof(Student)));//C语言的开辟空间的方式。
    if (List_Empty(L)) 
        return;
    else//初始化值
    {
        L.length = 0;
        L.listsize = LIST_SIZE;
    }
}
View Code

        List_Empty(L)//取决于你对空的解释。

技术分享
bool List_Empty(Sqlist L)
{
    return L.elem == NULL;
}
View Code

        List_Add_Insert(Sqlist &L , int coordinate , int newponit)//对链表添加和加入//如果对插入的算法不了解可以参考——这里

技术分享
void List_Add_Insert(Sqlist &L, int coordinate , Student newpoint)
{
    if (coordinate < 1 || coordinate > L.length + 1)//插入的位置是否合法
    {
        cout << "插入的位置超出范围" << endl;
        return;
    }
    if (L.length >= L.listsize)//如果开辟的空间已满,则添加新的空间
    {
        Student *newbase = (Student*)realloc(L.elem, (L.listsize + LIST_SIZE) * sizeof(Student));
        if (newbase == NULL)//每次开辟空间后一定要检查是否成功,因为开辟空间是从堆中找到比你需要空间略大的空间然后赋地址的,如果找不到比你需要空间大的,则会失败。
            return;
        L.elem = newbase;
        L.listsize += LIST_SIZE;
    }
    Student *q = &L.elem[coordinate - 1];
    for (Student *p = &L.elem[L.length - 1]; p >= q; p--)//先把位置移动一位,腾出插入点的位置。
        *(p + 1) = *p;
    strcpy(q->Name, newpoint.Name), q->Grade = newpoint.Grade;//改变值
    ++L.length;//当前值增长
}
View Code

       List_Change(Sqlist &L)//和List_Get(Sqlist)相差无几,后面我就不另加叙述了。

技术分享
void List_Change(Sqlist &L, int coordinate, Student newpoint)
{
    L.elem[coordinate - 1].Grade = newpoint.Grade;
}
View Code

         List_Erase(Sqlist &L , int coordinate)//删除位于coordinate位置的值。

技术分享
void List_Erase(Sqlist &L, int coordinate)
{
    if (coordinate < 1 || coordinate > L.length)//删除位置超出范围
    {
        cout << "插入的位置超出范围" << endl;
        return;
    }
    Student *p = &L.elem[coordinate - 1];
    Student *q = &L.elem[L.length - 1];
    for (++p; p <= q; p++)//将删除位置进行覆盖
        *(p - 1) = *p;
    --L.length;//当前长度减少
}
View Code

        List_Length(Sqlist L)//得到链表现有长度——由于过于简单和可以用L.length直接表示,所以感觉作用不到大。

技术分享
int  List_Length(Sqlist L)
{
    return L.length;
}
View Code

        List_Clear(Sqlist &L)//将链表原有值清空.

技术分享
void List_Clear(Sqlist &L)
{
    for (int i = 0; i < L.length; i++)
        L.elem[i].Grade = 0, strcpy(L.elem[i].Name, "0");
}
View Code

}

数据结构——线性表之顺序表

标签:范围   int   系统   数据   eof   查找   isp   size   amp   

原文地址:http://www.cnblogs.com/7750-13/p/7496037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!