VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1203|回复: 3

[交流] 数据结构学习之线性表的顺序存储结构

[复制链接]
95_avatar_middle
最佳答案
0 
在线会员 发表于 2011-12-21 20:18:21 | 显示全部楼层 |阅读模式
     大学里学过数据结构,上课云里雾里,学过之后依然什么印象都没有,学完了数据机构连个最简单的线性表、链表的代码都写不出来,如今大学已过大半,打算重新再学习一遍数据结构,补习一下数据结构与算法的知识,希望可以和大家探讨,共同学习。
线性表顺序存储结构:用一段地址连续的存储单元,依次存储线性表的数据元素。
线性表的顺序存储结构就像是小学生排队,一个接着一个,后一个抓着前一个的衣服,不论到哪里都是一对,都要占据一队的空间。如果队伍中的哪一位同学离开了,那么后边的同学都要向前移动一个位置,如果有一个同学要插入到队伍中,那么他后边的同学就都得向后移动一个位置了。
下边为线性表顺序结构的主要实现代码:
我用的是VC6.0,代码分在了三个文件中linelist.h,linelist.cpp和main.cpp
#################LineList.h######################################


#include <stdio.h>
#include <memory.h>
#define MAXSIZE        20
#define OK        1
#define ERROR        0
#define TRUE        1
#define FALSE        0

typedef int ElemType;                        //int型的数据元素
typedef int Status;                                //函数返回结果状态

typedef struct  
{
        ElemType data[MAXSIZE];                //数组存储元素
        int length;                                        //线性表中当前元素的长度
}LineList;

void InitList(LineList *list);
void ClearList(LineList *list);
Status IsListEmpty(LineList *list);
Status GetElem(LineList *list,int i,ElemType *elem);
Status LocateElem(LineList *list,ElemType elem);
Status InsertElem(LineList *list,int i,ElemType elem);
Status DeleteElem(LineList *list,int i,ElemType *elem);
Status ListLength(LineList *list);
void ShowElem(ElemType elem);



############LineList.cpp######################


#include "linelist.h"

//初始化建立一个空的线性表,设置长度为0
void InitList(LineList *list)
{
        list->length=0;
}


//判断线性表是否为空
Status IsListEmpty(LineList *list)
{
        if(0==list->length)
        {
                return TRUE;
        }
        return FALSE;
}

//将线性表清空,长度设置为0
void ClearList(LineList *list)
{
        list->length=0;
}

//返回线性表中第i个元素的值
Status GetElem(LineList *list,int i,ElemType *elem)
{
        if(list->length==0 || i<1 || i>list->length)
        {
                return ERROR;
        }
        *elem=list->data[i-1];
        return OK;
}

//查找线性表中与给定值相等的元素
Status LocateElem(LineList *list,ElemType elem)
{
        if(list->length==0)
        {
                return ERROR;
        }
        for(int index=0;index<list->length;index++)
        {
                if(elem==list->data[index])
                {
                        return (index+1);
                }
        }
        return ERROR;
}

//在线性表中的第i个位置插入元素
Status InsertElem(LineList *list,int i,ElemType elem)
{
        if(list->length==MAXSIZE)                //线性表已满
        {
                return ERROR;
        }
        if(i<1 || i>list->length+1)                //当i不在范围内时
        {
                return ERROR;
        }
        if(i<=list->length)                                //如果插入元素的位置不在表尾
        {
                for(int index=list->length-1;index>i-1;index--)
                {
                        list->data[index+1]=list->data[index];
                }
        }
        list->data[i-1]=elem;
        list->length++;
        return OK;
}

//删除线性表中第i个位置的元素
Status DeleteElem(LineList *list,int i,ElemType *elem)
{
        if(list->length==0)                        //线性表为空时
        {
                return ERROR;
        }
        if(i<1 || i>list->length)        //i不在范围内
        {
                return ERROR;
        }
        *elem=list->data[i-1];
        if(i<list->length)                 //i不在表尾
        {
                for(int index=i;index<list->length;index++)
                {
                        list->data[index-1]=list->data[index];
                }
        }
        list->length--;
        return OK;
}

//返回线性表中元素的个数
Status ListLength(LineList *list)
{
        return list->length;
}

//打印出指定的元素
void ShowElem(ElemType elem)
{
        printf(" %d ",elem);
}


#################Main.cpp#######################


#include "linelist.h"

int main(void)
{
        LineList *plist=new LineList;
        InitList(plist);
        //向线性表中添加1-5,5个元素
        for(int i=1;i<=5;i++)
        {
                InsertElem(plist,i,i);
        }
        //显示线性表中的元素
        ElemType elem;
        int length=ListLength(plist);
        for(int index=1;index<=length;index++)
        {
                GetElem(plist,index,&elem);
                ShowElem(elem);
        }
        printf("\n");
        //判断线性表是否为空
        if(IsListEmpty(plist))
        {
                printf("线性表为空\n");
        }
        else
        {
                printf("线性表不为空\n");
        }
        //查找线性表中是否有与给定元素相同的元素
        int e=5;
        int position=LocateElem(plist,e);
        if(position!=0)
        {
                printf("要查找的元素是 %d 找到符合的元素,该元素的位置是%d\n",e,position);
        }
        //删除线性表中的元素
        int pos=3;
        ElemType delelem;
        if(DeleteElem(plist,pos,&delelem))
        {
                printf("成功删除位置 %d 的元素 %d\n",pos,delelem);
        }
        //显示线性表中的元素
        ElemType em;
        int len=ListLength(plist);
        for(int j=1;j<=len;j++)
        {
                GetElem(plist,j,&em);
                ShowElem(em);
        }
        printf("\n");
        delete plist;
        return 0;
}

希望能和学习数据结构的同志们共同探讨,共同学习!




上一篇:在CSDN上注册的用户赶快进来
下一篇:Visual C++实现定制标题栏
04_avatar_middle
最佳答案
0 
在线会员 发表于 2011-12-21 20:33:34 | 显示全部楼层
            好好学习!!
51_avatar_middle
最佳答案
18 
online_admins 发表于 2011-12-21 23:01:08 | 显示全部楼层
感谢楼主分享
16_avatar_middle
最佳答案
0 
在线会员 发表于 2011-12-22 09:40:55 | 显示全部楼层
俺也学习下,感谢分享,顶顶顶!数据结构学习之线性表的顺序存储结构
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2020-1-28 02:27

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表