线性表(一)

线性表

线性表的概念

线性表:线性表是最常用且最简单的以重数据结构,是n个数据元素的的有序序列。

线性结构的特点:在非空线性结构表中,

  • 存在唯一的一个被称为“第一个”的结点。
  • 存在唯一的一个被称为“最后一个”的结点。
  • 除第一个之外,表中的每个结点均只有一个前驱结点。
  • 除最后一个之外,表中的每个结点均只有一个后继结点。

空表:线性表中元素n的个数为0,即n=0.

线性表的顺序存储结构(C语言)

#include<stdio.h>
#include<malloc.h>
#define OK 1 
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int

typedef int Status;
typedef struct
{
    int *elem;              
    int length;
    int listsize;
}SqList;


//构造一个空的线性表L
//该线性表预定义大小为LIST_INIT_SIZE
Status InitList_Sq(SqList &L)           
{
    L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if (!L.elem) return OK;         // 存储分配失败
    L.length = 0;                   // 空表长度为0
    L.listsize = LIST_INIT_SIZE;    // 初始存储容量
    return OK;
}

//销毁线性表L
//销毁成功返回OK 
Status DestroyList_Sq(SqList &L)
{
    if(L.elem)
    {
        free(L.elem);
        return OK;
    }
    else return ERROR;  
}


//清除线性表L,重置为空表 
Status ClearList_Sq(SqList &L)
{
    if(!L.elem) return ERROR;       //线性表不存在  
    L.length = 0;                   //记录表长(空表)  
    return OK;                      
}

Status ListLength(SqList &L)
{
    return L.length;
}

Status GetElem(SqList &L,int i,ElemType &e)
{
    if(i<L.length) return ERROR;
    e = L.elem[i];
    return OK;
}

//若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱。 
Status PriorElem(SqList &L,ElemType cur_e,ElemType &pre_e)
{
    int i = 0;
    while(L.elem[i] != cur_e && i<L.length) {i++;}
    if(i<L.length)
    {
        pre_e = L.elem[i-1];
        return OK;
    }
    else return ERROR;
} 


// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
Status ListInsert_Sq(SqList &L, int i, ElemType e) 
{
    ElemType *p;
    if (i < 1 || i > L.length+1) return ERROR;  // i值不合法
    if (L.length >= L.listsize)                 // 当前存储空间已满,增加容量
    {                               
        ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof (ElemType));
        if (!newbase) return ERROR;     // 存储分配失败
        L.elem = newbase;               // 新基址
        L.listsize += LISTINCREMENT;    // 增加存储容量
    }
    ElemType *q = &(L.elem[i-1]);       // q为插入位置
    for (p = &(L.elem[L.length-1]); p>=q; --p)
        *(p+1) = *p;                    // 插入位置及之后的元素右移
    *q = e;                             // 插入e
    ++L.length;                         // 表长增1
    return OK;
}


//在顺序线性表L中删除第i个元素,并用e返回其值。
//i的合法值为1≤i≤ListLength_Sq(L)。
Status ListDelete_Sq(SqList &L, int i, ElemType &e) 
{
    ElemType *p, *q;
    if (i<1 || i>L.length) return ERROR;    // i值不合法
    p = &(L.elem[i-1]);                     // p为被删除元素的位置
    e = *p;                                 // 被删除元素的值赋给e
    q = L.elem+L.length-1;                  // 表尾元素的位置
    for (++p; p<=q; ++p) *(p-1) = *p;       // 被删除元素之后的元素左移
    --L.length;                             // 表长减1
    return OK;
}

// 输出顺序表中的所有元素
int Load_Sq(SqList &L)
{
    int i;
    if(L.length == 0) printf("The List is empty!");
    else
    {
        printf("The List is: ");
        for(int i=1;i<L.length+1;i++) printf("%d ",L.elem[i-1]);
    }
    printf("\n");
    return OK;
}


int main()
{
    SqList T;
    int a, i;
    ElemType e, x;
    if(InitList_Sq(T))    // 判断顺序表是否创建成功
    {
        printf("顺序表创建成功\n");
    }
    while(1)
    {
        printf("1:插入数值\n2:删除数值\n3:打印所有数值\n");
        printf("4:输出特定位置的数值\n");
        printf("5:输出特定数值之前的数值\n");
        printf("6:输出顺序表长\n");
        printf("7:清空表\n");
        printf("0:退出\n请选择:\n");
        scanf("%d",&a);
        switch(a)
        {
            case 1: scanf("%d%d",&i,&x);
                    if(!ListInsert_Sq(T,i,x)) printf("插入失败!\n"); // 判断i值是否合法,请填空
                    else printf("数值 %d 已经被成功插入!\n", x);
                    break;
            case 2: scanf("%d",&i);
                    if(!ListDelete_Sq(T,i,e)) printf("删除失败!\n"); // 判断i值是否合法,请填空
                    else printf("数值 %d 已经被成功删除!\n", e);
                    break;
            case 3: Load_Sq(T);
                    break;
            case 4: scanf("%d",&i);
                    if(!GetElem(T, i, e)) printf("获取失败!\n");
                    else printf("第 %d 个数值是 %d!\n", i, e); 
                    break;
            case 5: scanf("%d",&i);
                    if(!PriorElem(T, i, e)) printf("无法找到!\n");
                    else printf("%d 前面是 %d\n",i,e); 
                    break;
            case 6: printf("表长是%d\n",ListLength(T)); 
                    break;
            case 7: ClearList_Sq(T); 
                    break;
            case 0: return 1;
        }
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343