2

一、线性表的定义

#define MAX 100 //这里定义一个整型常量MAX,值为100。

1、顺序表的结构定义

typedef struct{ 
    int data[MAX];
    //存放顺序表元素的数组(默认是int型,可根据题目要//求将int换成其他类型)。
    int length;
    //存放顺序表的长度。
} Sqlist;  //顺序表类型的定义。

如上下指示元素个数的变量length。
clipboard.png

顺序表比较简单,可以不用结构体直接定义:

int A[MAX];
int n;

2、单链表结点定义

typedef struct LNode{ 
    int data; 
    //data中存放结点数据域(默认是int型)。 
    struct LNode *next; 
    //指向后继结点的指针。 
} LNode; //定义单链表结点类型。

单链表结点结构图:
单链表结点结构图.png

3、双链表结点定义

typedef struct DLNode{ 
    int data; 
    //data中存放结点数据域(默认是int型
    struct DLNode *prior;
    //指向后继结点的指针
    struct DLNode *next;
    //指向前驱结点的指针
}DLNode; )//定义单链表结点类型

双链表结点结构图:

clipboard.png

二、顺序表的算法操作

本系列笔记中如果不做特殊说明则默认数组元素的存放从下标1开始,0号空位置不存数据以方便操作。

1、按元素值的查找算法

在顺序表中查找第一个元素值等于e的元素,并返回其下标,代码如下:

int LocateElem (Sqlist L, int e) { 
int i; 
for (i = 1 ; i <= L.length; i++) 
    if(e == L.data[i])
        return i;//找到返回下表(下表均大于0)。
return0;  //没找到返回0,作为标记,因为0位置上不存放元素。
}

2、插入数据元素的算法

在顺序表L的第p(1≤p≤length+1)个位置上插入新的元素e。如果p的输入不正确,则返回0,代表插入失败;如果p的输入正确则将顺序表第p个元素及以后元素右移一个位置,腾出一个空位置插入新元素,顺序表长度增加1,插入操作成功,返回1。

插入操作代码如下:

int insert (Sqlist &L, int p, int e){ 
    int i; 
    if (p < 1 || p > L.length + 1 || L.length == MAX)//位置错误或者表长已经达到 
        return0;//顺序表的最大允许值,此时插入不成功,返回0。
    for(i = L.length; i > = p; i--) 
        L.data[i+1] = L.data[i];//从后往前逐个将元素往后移动一个位置。
    L.data[p] = e;//将x放在插入位置p上。
    L.length++;//表内元素多了一个,因此表长自增1。
    return1; //插入成功返回1。 
}

3、删除数据元素的算法

删除顺序表L中下标为p(1≤p≤length)的元素,成功返回1,否则返回0,并将被删除元素的值赋值给e:

int listDelete (Sqlist &L, int p, int &e) { //需要改变的变量用引用型。
    int i; 
    if(p < 1 || p > L.length)
        return0;//位置不对返回0,代表删除不成功。
    e=L.data[p]; //将被删除元素赋值给e。 
    for(i = p; i <= L.length; i++) //从p位置开始将其后边的元素逐个前移一个位置。 
        L.data[i] = L.data[i+1];
    L.length--; //表长减1。
    return1; //删除成功返回1。 
}

4、初始化顺序表的算法

只需将length设置为0。

void InitList(Sqlist &L){ //L本身要发生改变所以用引用型 
    L.length=0; 
}

5、求指定位置元素的算法

用e返回L中p(1≤p≤length)位置上的元素:

int GetElem(Sqlist L, int p,int &e){ //要改变所以用引用型
    if(p < 1 || p >L.length) // p值越界错误,返回0
        return 0;
    e=L.data[p];
    return1;
}

kidsamong
2.8k 声望138 粉丝

进击的程序猿