用线性表建立学生信息
这是继上一次实验(顺序表)的后续,即用线性表的链式表示和实现,这个实验的要求相关事项这里就不再赘述,可以到我的上一篇文章去看,顺序表的内容也在上一篇文章,这里仅对单链表的操作进行表示和实现。
初始化部分:即构造一个空链表。
【算法描述】
Status InitList(LinkList &L)
{
L=new LNode; //新结点作为头结点
L->next=NULL; //指针域置空
return OK;
}
取值:链表的取值只能从链表的首元结点出发,顺着链域next逐个结点向下访问。
【算法描述】
Status GetElem(LinkList L,ElenType e)
{
P=L->next;j=1; //初始化,p指向首元结点
while(p&&j<i) //直到p为空或者p指向第i个元素
{
p=p->next; //p指向下一个结点
++j;
}
if(!p||j>i) return ERROR; //i的值不合法i>n or i<=0
e=p->data; //取第i个结点的数据域
return OK;
}
查找:查找过程跟顺序表类似,从链表的首元结点出发,依次将结点值和给定的值e进行比较,返回查找结果。
LNode *LocateElem(LinkList L,ElemType e)
{
P=L->next; //初始化,p指向首元结点
while(p&&p->data!=e)
p=p->next;
return p; //查找成功返回值为e的结点地址p,查找失败p为NULL
}
插入:链表的插入不需要像顺序表的插入操作那样需要移动元素,只需要在在一条链中的两元素之间断开,再用前一个数据元素的指针域指向要插入的数据元素,再令要插入数据元素的指针域指向指向刚才与前一数据元素相连接的后一个数据元素,即后一个数据元素,指针修改可以用数据元素描述为 s->next=p->next; p->next=s;
【算法描述】
Status ListInsert(LinkList &L,int i,ElemType e)
{
p=L;j=0;
while(p&&(j<i-1))
{
p=p->next;++j;} //查找到第i-1个结点,p指向该结点
if(!p||j>i-1) return ERROR; //插入位置不合理
s=new Node; //生成新结点
s->data=e; //将结点*s的数据域置为e
s->next=p->next;
p->next=s;
return OK;
}
删除:删除操作跟插入操作一样,只不过这是减少一个数据元素,表长减一。首先找到指定位置的前驱结点,删除该元素时只需修改该数据元素的前一个元素的指针即可,可以描述为 p->next=p->next->next; 还要引入另一个结点,用来释放刚才已经删除了的数据元素的地址。
【算法描述】
Status ListDelete(LinkList &L,int i)
{
p=L;j=0;
while((p->next) && (j<i-1)) //找到第i-1个结点,p指向该结点
{
p=p->next;++j;}
if(!(p->next) && (j>i-1