1、单链表的初始化
首先定义一个结构体链表,每一个结构链表里面包含两种东西,数据域和指针域。
typedef struct LNode* List;//定义了一个指向结构体LNode的指针类型 取个名字List
sturct LNode{
ElementType Date;//数据域
List Next;//指针域 指向下一个结点的指针
};
struct LNode L;//定义了一个名为L的结构体变量 就是上边LNode那个结构体
List PtrL;//名为PtrL的指针变量
在这个代码中,只创建了一个结构体链表
接着初始化:
Status InitList(LinkList &L)//定义一个空链表
{
L=new LNode;//先开辟一个新结点,与顺序表初始化一样,也是用new 但是指针L得指向头指针,便于后续操作
L->next=NULL;//头结点指针域肯定为空。
return OK;//告诉函数我做完了 可以返回了
}
2.求表长
求长度可以用遍历,就是把每一个元素一个一个看看,然后用一个累加器加起来
int Length(List PtrL)//只知道头指针
{
List p=PtrL;//设一个临时指针p指向表的第一个结点
int j=0;//累加器
while(p){//循环条件? 链表还没结束,就是p指针不等于空
p=p->Next;//链表的指针往后挪一位
j++;//每遍历一个加个1
}
return j;
}
循环条件为指针p不为空,然后p一直指向后一个就可以了
3.查找
第一种是按值查找
LNode *LocateElem(LinkList L,ElemType e)
{
p=L->Next;//p设为链表的头
while(p!=NULL && p->Date!=e)//表不空 然后另外一个 就是没找到 就是Date不等于e
{
p=p->Next;//遍历链表 一直往后挪
}
return p;
}
这个循环退出来只有两种可能,1是Date找到e了 那就返回e所在结点的地址就是p
2是p=NuLL 就是没找到这个值。
第二种是按序号查找:
LNode* LocateElem(int k, LinkList L)
{
LinkList p = L->Next;
int i=1;
while (p != NULL && i < k)
{
p = p->Next;
i++;
}
if (i == k) return p;
else return NULL;
}
4.单链表的插入(带头指针的链表L中的i个位置插入值为e的插入)
插入步骤:首先我得查找到后一个结点,然后让指针p指向它
接着生成一个新的结点*s 这个结点的作用是把你要插入的那个结点Date 及指针域都赋给他
接着把e赋给新结点的Date
再着把指针域也赋给前一个结点
最后p结点指向s
就是这个意思:你插入一个东西 你插入的那个地方他后边的地址你得知道 前一个地址你也得知道,它的前一个地址我用p来指着呢 当要插入的这个东西你把它也弄个指针域就是*s 你*s指向后一个的地址 然后再让前一个地址指向*s就完事了
Status ListInsert(LinkList& L, int i, Elemtype e)
{
p = L;
j = 0;
while (p && (j < i - 1))//查找第i-1结点 也可以用前边的那个函数
{
p = p->Next;
j++;
}
s = new LNode;//创建一个新结点s
s->Date = e;//将e的值赋给s的数据域
s->Next = p->Next;//将新节点s的指针指向原来第i个节点的下一个节点
p->Next = s;//p结点指向s
return OK;
}
s->Next = p->Next;
p->Next = s;
这两个代码不能搞反
答案为B。