一、线性表的定义
#define MAX 100 //这里定义一个整型常量MAX,值为100。
1、顺序表的结构定义
typedef struct{
int data[MAX];
//存放顺序表元素的数组(默认是int型,可根据题目要//求将int换成其他类型)。
int length;
//存放顺序表的长度。
} Sqlist; //顺序表类型的定义。
如上下指示元素个数的变量length。
顺序表比较简单,可以不用结构体直接定义:
int A[MAX];
int n;
2、单链表结点定义
typedef struct LNode{
int data;
//data中存放结点数据域(默认是int型)。
struct LNode *next;
//指向后继结点的指针。
} LNode; //定义单链表结点类型。
单链表结点结构图:
3、双链表结点定义
typedef struct DLNode{
int data;
//data中存放结点数据域(默认是int型
struct DLNode *prior;
//指向后继结点的指针
struct DLNode *next;
//指向前驱结点的指针
}DLNode; )//定义单链表结点类型
双链表结点结构图:
二、顺序表的算法操作
本系列笔记中如果不做特殊说明则默认数组元素的存放从下标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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。