数据结构【线性表】

首先附上最完整的代码实现:尊重原创(图文并茂)

线性表的定义(图文并茂):

1.线性表的定义

若将线性表记为(a1,...,ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。
线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表。


2.线性表的顺序存储结构

线性表的顺序存储结构(数组模拟),指的是一段地址连续的存储单元依次存储线性表的数据元素。

2.1地址计算方法

用数组存储顺序表意味着要分配固定长度的数组空间,分配的数组空间大于等于当前线性表的长度,数据元素的序号和存放它的数组下标之间存在对应关系:

存储器的每个存储单元都有自己的编号,这个编号称为地址。

每个数据元素都需要占用一定的存储单元空间的,假设占用的是c个存储单元,对于第i个数据元素ai存储位置为(LOC表示获得存储位置的函数):

LOC(ai) = LOC(a1) + (i-1)*c。


2.2线性表顺序存储的结构代码:

首先我们写一个顺序存储:(数组模拟)

内置函数:

Status ListClear(Sqlist &L)——清空

Status GetElem(const Sqlist &L,const int &i,ElemType &e)——询问

Status ListInsert(Sqlist &L,int i,ElemType e)——插入

Status ListDelete(Sqlist &L,int i,ElemType &e)——删除


第一步:我们需要定义出来结构体:

typedef struct Sqlist{
    ElemType data[MAXSIZE];
    int length;
    Sqlist(){
        length=0;
    }
}Sqlist;

 第二步:我们需要把上述的函数 一 一实现:

清空:

/* 重置为空表——清空*/
Status ListClear(Sqlist &L){
    memset(L.data,0,sizeof(L.data));
    L.length=0;
    return OK;
}

 查询:

/* 获取某个下标的元素的值——查询*/
Status GetElem(const Sqlist &L,const int &i,ElemType &e){
    if(L.length==0||i<1||i>L.length){
        printf("询问时:下标 %d,不合法。\n",i);
        return ERROR;
    }
    e=L.data[i-1];
    return OK;
}

 插入:

/* 指定某个位置插入某元素——插入*/
Status ListInsert(Sqlist &L,int i,ElemType e){
    int k,len=L.length,temp;
    if(len>=MAXSIZE){
        printf("错误提醒:线性表已满\n\n");
        return ERROR;
    }else if(i<1||i>len+1){
        printf("错误提醒:所插入的位置%d ,位置不合法\n\n",i);
        return ERROR;
    }else if(i<=len){
        for(k=len-1;k>=i-1;k--){
            L.data[k+1]=L.data[k];
        }
    }
    L.data[i-1]=e;
    L.length++;
    printf("下标为:%d , 元素为:%d ,插入元素成功\n\n",i,e);
    /*检查每个位置元素*/
    for(int i=1;i<=L.length;i++){
        GetElem(L,i,temp);
        printf("第%d个 :%d\n",i,temp);
    }
    printf("\n");
    return TRUE;
}

 删除:

/*删除指定下标的某个元素*/
Status ListDelete(Sqlist &L,int i,ElemType &e){
    int k;
    if(L.length==0){
        printf("线性表为空\n");
        return ERROR;
    }
    if(i<1||i>L.length){
        printf("错误提示:删除的下标:%d\n",i);
        return ERROR;
    }
    e=L.data[i-1];
    if(i<L.length){
        for(k=i;k<=L.length;k++){
            L.data[k-1]=L.data[k];
        }
    }
    printf("删除成功,删除元素下标为:%d . 删除元素为:%d\n",i,e);
    L.length--;
    return OK;
}

第三步:测试每个函数实现功能

附上自己测试的代码:

#include<stdio.h>         //线性表:顺序存储结构
#include<string.h>
#define MAXSIZE 9
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Sqlist{
    ElemType data[MAXSIZE];
    int length;
    Sqlist(){
        length=0;
    }
}Sqlist;
Status ListShow(Sqlist &L);
/* 重置为空表——清空*/
Status ListClear(Sqlist &L){
    memset(L.data,0,sizeof(L.data));
    L.length=0;
    return OK;
}
/* 获取某个下标的元素的值——查询*/
Status GetElem(const Sqlist &L,const int &i,ElemType &e){
    if(L.length==0||i<1||i>L.length){
        printf("询问时:下标 %d,不合法。\n",i);
        return ERROR;
    }
    e=L.data[i-1];
    return OK;
}
/* 指定某个位置插入某元素——插入*/
Status ListInsert(Sqlist &L,int i,ElemType e){
    int k,len=L.length,temp;
    if(len>=MAXSIZE){
        printf("错误提醒:线性表已满\n\n");
        return ERROR;
    }else if(i<1||i>len+1){
        printf("错误提醒:所插入的位置%d ,位置不合法\n\n",i);
        return ERROR;
    }else if(i<=len){
        for(k=len-1;k>=i-1;k--){
            L.data[k+1]=L.data[k];
        }
    }
    L.data[i-1]=e;
    L.length++;
    printf("下标为:%d , 元素为:%d ,插入元素成功\n\n",i,e);
    /*检查每个位置元素*/
    ListShow(L);
    printf("\n");
    return TRUE;
}
/*删除指定下标的某个元素*/
Status ListDelete(Sqlist &L,int i,ElemType &e){
    int k;
    if(L.length==0){
        printf("线性表为空\n");
        return ERROR;
    }
    if(i<1||i>L.length){
        printf("错误提示:删除的下标:%d\n",i);
        return ERROR;
    }
    e=L.data[i-1];
    if(i<L.length){
        for(k=i;k<=L.length;k++){
            L.data[k-1]=L.data[k];
        }
    }
    printf("删除成功,删除元素下标为:%d . 删除元素为:%d\n",i,e);
    L.length--;
    return OK;
}
Status ListShow(Sqlist &L){
    int temp;
    if(L.length==0){
        printf("访问的线性表为空\n");
        return ERROR;
    }
    for(int i=1;i<=L.length;i++){
        GetElem(L,i,temp);
        printf("%d%c",temp,i==L.length?'\n':' ');
    }
    return OK;
}
int main()
{
    Sqlist L;
    int a[]={1,2,3,4,5,6,7},ans,temp;

    memcpy(L.data,a,sizeof(a));
    L.length=7;
    ListShow(L);
    /*测试——询问环节*/
    printf("\n****测试——询问环节****\n\n");
    if(GetElem(L,2,ans)){
        printf("%d\n",ans);
    }
    if(GetElem(L,8,ans)){
        printf("%d\n",ans);
    }
    /*测试——插入环节*/
    printf("\n****测试——插入环节****\n\n");
    ListInsert(L,2,10);
    ListInsert(L,-1,222);
    ListInsert(L,10,222);
    ListInsert(L,7,222);
    ListInsert(L,7,32);

    /*测试——清空环节*/
    printf("\n****测试——清空环节****\n\n");
    ListClear(L);
    printf("%d\n",L.length);

    Sqlist La,Lb;

    memcpy(La.data,a,sizeof(a));
    La.length=7;

    ListShow(La);

    /*测试——删除环节*/

    printf("\n****测试——删除环节****\n\n");

    ListDelete(La,3,temp);


    ListDelete(La,10,temp);
    ListDelete(La,-1,temp);

    return 0;
}

链式线性表:

#include<time.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0
typedef int Status;
typedef int ElemType ;
typedef struct Node {
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node * LinkList;
/*
询问环节,通过历遍整个链表来找到对应下标的元素。
注意抛出不合法情况。
*/
Status GetElem(LinkList head,int i,ElemType &e)
{
    int j=1;
    LinkList p;
    p=head->next;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||i<j){
        if(!p){
            printf("错误提示:所给下标的值:%d ,比链表长度:%d要长",i,j);
        }else if(i<j){
            printf("错误提示:所给下标的值:%d不合法",i);
        }
        return ERROR;
    }
    e=p->data;
    printf("询问成功!!!\n");
    return OK;
}
/*
插入环节:找到对应的下标,插入元素。
注意要抛出不合法的情况。
*/
Status ListInsert(LinkList *head,int i,ElemType e){
    int j=1;
    LinkList p=*head;

    while(p&&j<i){
        p=p->next;
        j++;
    }

    if(!p||i<j){
        if(!p){
            printf("错误提示:所给下标的值:%d ,比链表长度:%d要长",i,j);
        }else if(i<j){
            printf("错误提示:所给下标的值:%d不合法",i);
        }
        return ERROR;
    }

    LinkList s=(LinkList)(malloc(sizeof(Node)));

    s->data=e;
    s->next=p->next;
    p->next=s;
    printf("插入成功!!!\n");
    return OK;

}
Status ListDelete(LinkList &L,int i,ElemType &e){
    int j=0;
    LinkList p=L;
    while(  (p->next)&&(j<i-1)  ){
        p=p->next;
        j++;
    }
    if(     (!p)    ||  (j>i-1)  ){
        printf("删除失败!!!\n所删除的下标为:%d\n",i);
        return ERROR;

    }
    LinkList q=p->next;
             p->next=q->next;
    e=q->data;
    free(q);
    printf("删除:下标:%d    元素:%d\n",i,e);
    return OK;
}
Status ListShow(LinkList &L){
    LinkList p=L->next;
    if(!p){
        printf("所在的链式线性表为空\n");
        return ERROR;
    }
    while(p->next){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}
Status CreateListHead(LinkList *L,int n){

    LinkList p;
    srand(time(0));
    int i;

    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;

    for( i = 0 ; i < n ;i ++ ){
        p=(LinkList)malloc(sizeof(Node));
        p->data=rand()%100+1;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}
Status CreateListTail(LinkList *L,int n){

    LinkList p;
    srand(time(0));
    int i;

    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;

    LinkList tail;
    tail = *L;
    for( i = 0 ; i < n ;i ++ ){
        p=(LinkList)malloc(sizeof(Node));
        p->data=rand()%100+1;
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
}
Status ListClear(LinkList *L){
    int i;
    LinkList p,q;
    p=(*L)->next;
    while( p ){
        q=p->next;
        free(p);
        p=q;
    }
    (*L)->next=NULL;
    return OK;
}
int main()
{
    LinkList a;
    CreateListTail(&a,10);
    ListShow(a);
    ListClear(&a);
    ListShow(a);
    int e;
    LinkList head =(LinkList)malloc(sizeof(Node));
    LinkList s1=(LinkList)malloc(sizeof(Node));
    s1->data=4;
    s1->next=NULL;
    head->next=s1;
    ListInsert(&head,1,2);
    ListInsert(&head,2,3);
    ListInsert(&head,2,7);
    ListInsert(&head,3,5);
    GetElem(head,3,e);
    printf("询问:下标:%d    元素:%d\n",3,e);
    ListDelete(head,2,e);
    return 0;

}

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/82586213