目录
1.线性表链式存储结构定义
1.线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
2.在链式存储结构中每一个结点除了存储数据元素之外,还需存储一个指示其直接后继的信息。我们把存储数据元素信息的欲称为数据欲,把存储直接后继位置的欲称为指针域。指针域中存储的信息称为指针或链。
3.N个节点链接成一个链表,即为线性表的链式存储结构。因为此链表的每个结点中只包含一个指针域,所以叫做单链表。
4.我们把链表中第一个结点的存储位置叫做头指针,线性链表的最后一个结点指针为空。有时,我们为了更加方便的对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。
2.线性表链式存储结构代码描述
1.线性表的单链表存储结构。
代码如下:
typedef struct Node //声明结点的类型和指向结点的类型指针
{
ElemType data;
struct Node *next;
}Node;
typedef sruct Node *LinkList; //定义一个指向结点的指针
2.单链表的读取
代码如下:
/*初始条件:链式线性表L已存在,1<=i<=ListLength(L) */
/*操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; //声明一个结点
p=L->next; //让p指向链表的第一个结点
j=1; //j为计数器
while(p&&j<i) //p不为空或者计数器 j还没有等于i时,循环继续
{
p=p->next; //让p指向下一个结点
++j;
}
if(!p||j>i) //如果第i个元素不存在
return ERROR;
*e=p->data; //获取第i个元素数据
return OK;
}
3.单链表的插入
代码如下:
/*初始条件同上*/
/*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(LinkList *L,int i,Elemtype e)
{
int j;
LinkList p,s;
p=*L;
j=1;
while(p && j<i) //寻找第i个结点
{
p=p->next;
++j;
}
if(!p||j>i) //如果第i个元素不存在
return ERROR;
s=(LinkList)malloc(sizeof(Node)); //开辟一段空间,生成一个新结点
s->data=e;
s->next=p->next; //将p的后继结点赋值给s的后继
p->next=s; //将s赋值给p的后继
return OK;
}
4.单链表的删除
代码如下:
/*初始条件同上*/
//操作结果:删除L的第i个数据元素,用e返回其值,L的长度减1
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p=*L;
j=1;
while(p->next&&j<i) //找寻第i个元素
{
p=p->next;
++j;
}
if(!(p->next)||j>i) //第i个元素不存在
return ERROR;
q=p->next;
p->next=q->next; //将q的后继赋值给p的后继
*e=q->data; //将q结点中的数据给e
free(q); //让系统收回此结点,释放内存
return OK;
}