线性表

定义

线性表是具有相同数据类型的n个数据元素的有序序列, 其中n为表长,当n=0为空表。

备注

位序是从1开始的。

基本操作

InitList(&L);
DestoryList(&L);
ListInsert(&L,i,e);
ListDelete(&L,i,&e);
LocateElem(&L,e);
GetElem(&L,i);

顺序存储实现线性表

用顺序存储的方式实现线性表,逻辑相邻的元素在物理位置上也是相邻的。

#include <stdio.h>
#define MaxSize 100

typedef struct 
{
   int data[MaxSize];
   int length;
} SqList;

// 初始化
void InitList(SqList &L) ; 
// 判断是否为空
bool Empty(SqList L);                              
// 获取长度
// 获取特定index 的值
int GetElem(SqList L, int idx) ;
// 查找特定值的index
int LocateElem(SqList L, int val) ;
// 插入
bool ListInsert(SqList &L, int idx , int val);
// 删除
//删除
bool ListDelete(SqList &L, int idx, int &e) ;

void InitList(SqList &L) {
    for (int i=0; i<MaxSize; i++){
        L.data[i] =0;
    }  
    L.length = 0 ;
}

bool Empty(SqList L){
    if (L.length ==0){
        return true;
    }
    return false;
}

int GetElem(SqList L, int idx) {
    if (idx <0 || idx >L.length){
        return -1;
    }
    return L.data[idx-1] ;
}

int LocateElem(SqList L, int val){
    for (int i =0 ;i<L.length;i++){
        if (val == L.data[i]){
            return i+1;
        }
    }
    return 0 ;
}

bool ListInsert(SqList &L, int idx , int val){
    if (idx <1 || idx >L.length+1){
        return false;
    }
    if ( L.length >=MaxSize ){
        return false ;
    }
    for (int i=L.length;i>=idx ;i--){
        L.data[i] = L.data[i-1] ;
    }
    L.data[idx-1] = val ; 
    L.length +=1 ;
    return true ;
}
bool ListDelete(SqList &L, int idx, int &e) {
    if (idx <1 || idx >L.length){
        return false ;
    }
    e = L.data[idx-1] ;
    for (int i=idx; i<L.length;i++){
        L.data[i-1]= L.data[i] ;
    }
    L.length -=1 ;
    return true ;

}

void PrintSqList(SqList L) {
    //循环打印
    printf("开始打印顺序表\n");
    for (int i = 0; i < L.length; i++) {
        printf("Data[%d]==%d\n", i, L.data[i]);
    }
    printf("打印结束!\n");
}


void TestSqList() {
    SqList L;
    InitList(L);

//    初试化一些值
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.length = 3;

    //插入操作
    if (ListInsert(L, 2, 3)) {
        printf("插入成功了\n");
    } else {
        printf("插入失败了,i的位置不合法,请检查\n");
    }

    PrintSqList(L);
    //删除操作
    int e = -1;
    if (ListDelete(L, 2, e)) {
        printf("删除成功!删除的值是:%d\n", e);
    } else {
        printf("删除失败,请检查位序是否正确\n");
    }

    //数组当前长度
    printf("数组当前长度是多少?%d\n", L.length);

    //查找第一个元素是什么?
    printf("第一个元素是什么?\n %d\n", GetElem(L, 1));

    //查找值为3的元素在什么位置
    printf("第一个值为3的元素在什么位置?\n %d \n", LocateElem(L, 3));

    //打印输出

    PrintSqList(L);

}

特点: - 随机访问 - 存储密度高 - 拓展容量不方便 - 插入删除不方便。

链式存储实现线性表

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100

#define ElemType int 

typedef struct LNode
{
   ElemType data ; 
   LNode *next ; 
} LNode,*LinkList;

// 初始化
bool InitList(LinkList &L) ; 
// 判断是否为空
bool Empty(LinkList L);                              
// 获取长度
// 获取特定index 的值
LNode* GetElem(LinkList L, int i) ;
// 查找特定值的index
LNode* LocateElem(LinkList L, ElemType val) ;
// 插入
bool ListInsert(LinkList &l, int idx , int val);
// 删除
//删除
bool ListDelete(LinkList &L, int idx, int &e) ;

bool InsertPriorNode(LNode *p, int e) ;
bool InsertNextNode(LNode *p, int e) ;



bool InitList(LinkList &L) {
    L =  (LNode *) malloc(sizeof(LNode));
    if (L == NULL){
        return false;
    }
    L->next = NULL;
    return true;
}
// 判断是否为空
bool Empty(LinkList L){
    if (L->next ==NULL){
        return true ; 
    }
    return false ;
}                              
// 获取长度
// 获取特定index 的值
LNode* GetElem(LinkList L, int i){
    if (i<=0){
        return NULL;
    }
    LinkList p = L ;
    int j =0 ;
    while (p && j <i)
    {
        p=p->next;
       j+=1;
    }
    return p ;
    
}
// 查找特定值的index
LNode* LocateElem(LinkList L, ElemType val){
    LinkList p = L->next ;
    while (p!=NULL && p->data != val){
            p=p->next;
    }
    return p ;

}
// 插入
bool ListInsert(LinkList &L, int idx , int val){
    LNode *p = GetElem(L,idx-1);
    if (p==NULL){
      return false;
    }

    return InsertNextNode(p,val) ;
}
// 删除
//删除
bool ListDelete(LinkList &L, int i, int &e) {
    LNode *p = GetElem(L,i-1);
    if (p==NULL){
        return false;
    }
    if (p->next ==NULL){
        return false;
    }
    LNode *q = p->next;
    e = q->data;
    p->next = q->next;
    free(q) ;
    return true ;
}
int ListLen(LinkList L){
    int cnt =0;
    LinkList  cur = L->next;
    while (cur){
        cnt +=1 ;
        cur = cur->next;
    }
    return cnt ;
}
void PrintList(LinkList L) {
    //循环打印
    printf("开始打印顺序表\n");
    LinkList cur  = L->next ;
    while (cur !=NULL){
        printf("%d\t",cur->data);
        cur = cur->next;
    }
    printf("打印结束!\n");
}
bool InsertPriorNode(LNode *p, int e){
    if (p == NULL){
        return false;
    }
    LNode *s = (LNode *) malloc(sizeof(LNode)) ;
    if (s == NULL){
        return false;
    }
    s->next = p->next ; 
    p->next =s ; 

    s->data =p->data ; 
    p->data =e ; 
    return true ;
}
bool InsertNextNode(LNode *p, int e) {
    if (p == NULL){
        return false;
    }
    LNode *s = (LNode *) malloc(sizeof(LNode)) ;
    if (s == NULL){
        return false;
    }
    s->data = e ; 
    s->next = p->next ;
    p->next = s ;
    return true ;
}

LinkList List_HeadInsert(LinkList &L){
    int x ; 
    LNode *s ; 
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    scanf("%d",x);
    while (x !=9999){
        s = (LNode*)malloc(sizeof(LNode));
        s->data =x ; 
        s->next = L->next ; 
        L->next = s ; 
       scanf("%d",x);
    }
    return L ; 
}
LinkList List_TailInsert(LinkList &L){
    int x ; 
    LNode *r , *s; 
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    r = L ; 
    scanf("%d",&x) ;
    while(x!=9999){
        s = (LNode*)malloc(sizeof(LNode));
        if (s==NULL){
            //destroy
            return NULL;
        }
        s ->data = x ; 
        r->next = s ; 
        r =s ;
        scanf("%d",&x) ;
    }
    r->next = NULL;
    return L ; 
}

void Test_LinkList() {
    LinkList L;
    InitList(L);

//    初试化一些值
    ListInsert(L,1,1);
    ListInsert(L,1,2);
    ListInsert(L,1,3);
    ListInsert(L,1,4);
    PrintList(L);
    printf("%d",ListLen(L));
    //插入操作
    if (ListInsert(L, 2, 10)) {
        printf("插入成功了\n");
        PrintList(L);
    } else {
        printf("插入失败了,i的位置不合法,请检查\n");
    }

    //删除操作
    int e = -1;
    if (ListDelete(L, 2, e)) {
        printf("删除成功!删除的值是:%d\n", e);
    } else {
        printf("删除失败,请检查位序是否正确\n");
    }
    //删除操作
    PrintList(L);
    if (ListDelete(L, ListLen(L)+1, e)) {
        printf("删除成功!删除的值是:%d\n", e);
    } else {
        printf("删除失败,请检查位序是否正确\n");
    }
    //数组当前长度
    PrintList(L);
    printf("数组当前长度是多少?%d\n", ListLen(L));

    //查找第一个元素是什么?
    printf("第一个元素是什么?\n %d\n", GetElem(L, 1));

    //查找值为3的元素在什么位置
    printf("第一个值为3的元素在什么位置?\n %d \n", LocateElem(L, 3));

    //打印输出

    PrintList(L);

    List_TailInsert(L);
    PrintList(L);

}

int main(){
    Test_LinkList();
}