线性表的结构体定义
顺序表结构体定义
#define maxsize 100
typedef struct
{
int data[maxsize];//定义一个存放结构体的数组,这个数组有自己的最大容量
int length;//这里定义一个长度,这个长度可以理解为有效长度,比如有100个房间但不一定需要100个房间里面都有人。
}
一个顺序表包括一个存储表中元素的数组data[ ]和一个指示元素个数的length。
2.单链表结点定义
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
3.双链表的结点定义
typedef struct LNode
{
int data;
struct DLNode *prior;
struct DLNode *next;
}
结点是内存中一片由用户分配的存储空间,只有一个地址来表示他的存在,没有显示的名称,因此我们会在分配链表结点空间的时候,同时定义一个指针,来存储这片空间的地址,并且常用指针的名称来作为结点的名称。
LNode *A=( LNode * )malloc(sizeof(LNode));
1>用户分派了一片LNode型空间,也就是构造了一个LNode型的结点。这个A定义了两个东西:一个是结点,一个是指针(并且这个指针指向后继元素的的存储单元)。
2>在链表中必须搞清每一个东西,在后面的 各种表示中才能反应迅速。当出现“p指向q”的时候你就知道此时,p代表的是指针,因为结点不能指向结点。当用函数free()释放p的空间的时候,此时p代表结点,因为p即是指针又是结点,但是指针变量自身所需要的存储空间是系统分配的,不需要用户调用free()来释放,只用用户分配的存储空间才需要用户自己来释放。
顺序表操作.
1.按元素值的查找的方式
在顺序表中查找一个值等于e的元素,并返回其下标
int Findelem (Sqlist L,int e)
{
int i;
for(i=0;i<L.length;++i)
{
if(e==L.data[i])
return i;
}
return -1;
}
2.插入元素的代码
在顺序表L的第p个位置上插入新的元素e,(0<L<length)
int InsertElem (Sqlist &L,int p,int e)
{
int i;
if (p<0||p>L.length||L.length==maxsize)//对p的位置进行限制,要么位置错误,要么线性表已经饱和。
return 0;
for(i=L.length;i>=p;--i)
L.data[i+1]=L.date[i];
L.data=e;
++(L.length);
return 1;
}
3.删除顺序表L下标为p的元素,,成功返回1,否则返回0,将删除元素的值赋给e。
int DeleteElem (Sqlist &L,int p,int &e)
{
int i;
if(p<0||p>L.length-1)
return 0;
e=L.data[p];
for(i=p;i<L.length;++i)
{
L.data[i]=L.data[i+1];
}
--(L.length);
return 1;
}
//要删除表中下标为p的元素,只需要将其后面的元素逐个往前移动,将p上的元素覆盖掉,再由后面的元素把前面的元素覆盖掉即可。
**1)**初始化顺序表的算法,只需要将length设置成0,即可。
void initlist (Sqlist &L)
{
L.length=0;
}
**2)**求指定位置元素的算法
int getelem (Sqlist L,int p ,int &e)
{
if(p<0||p>L.length-1)
return 0;
e=L.data[p];
return 1;
}