一、单链表的创建
typedef struct LNode //定义节点为结构体类型 ,typedef给LNode重命名为下面的两个名字
{
ElemType data; //定义数据域,类型为ElemType,此类型为用户自定义类型,用户可以根据 需要进行定义,例如,我需要是int类型,我就在一开始时给int重命名为ElemType struct LNode *next; //定义指针域,指针域指向下一个节点,存的是struct LNode类型变量的地址
}LNode,*LinkList; //LNode为结构体类型的普通类型 ,*LinkList为结构体类型的指针类型 ,因此LNode *p和LinkList p是等价的,但为了增加程序可读性,一般用LinkList定义头指针,LNode定义中间的指针
二、单链表的初始化
Status InitList(LinkList &L) //Status为函数类型,也由用户根据需要自己定义,例如想要是int类型的,就在开始时给int重命名为Status ,&为引用,使用&时,形参改变实参也会变,形参相当于只是实参的重命名,因为初始化链表从无到有,我们需要实参也发生相应变化,所以用引用
{ L=new LNode; //生成一个头节点,使头指针指向它
L->next=NULL; //当刚创建头节点时,后面还没有节点,所以指针域为空
if(L==NULL) return ERROR; //创建不一定成功,看看L是否为空,如果为空,说明创建失败,返回ERROR,成功返回OK
return OK; //ERROR和OK 都是用户在一开始可以给他们自定义数值的,例如#define OK 1
}
三、单链表的取值
Status GetElem(LinkList L,int i,ElemType e) //i为要取值的位置,e是我们要赋值的变量
{
LNode*p;int j; //创建一个指针p,使指针p移动,协助我们找到位置,j相当于一个计数器,记录当前的位置,注意j和p要始终一直,当p指向序号为1的节点时,j的值就要为1
p=new LNode; //如果要取值时,我们指向哪个节点,就可以取出哪个节点的数值,所以我们直接直接指向首元节点,首元节点的地址在头节点中,因为头指针指向头节点,所以l->next 可以找到首元结点的位置
p=L->next;
j=1; //因为p指向首元结点,下标为1,所以j也为1,j是计数器,记录当前位置,要与p一一对应
while(p&&j<i){ //P的合法范围为a1到an,所以当p等于null时已经超出p的合法范围,此时循环不再执行,只有当i的值大于n,才会使p能执行到an再往下进行,所以i的位置也不合法
p=p->next; //当j=i时,此时循环结束此时p指向ai,是在合法范围内结束,此时循环是由于找到位置而正常结束,若是因为p=NULL而结束,此时是不合法的结束
j++;
}
if(p==NULL||j>i) //在此过程中,i的合法范围为1到n,如果说p=NULL,说明p循环到a(n+1)了,此时为空,这是由于i的位置超过了n才会使p一直循环到NULL ,若是因为j>i不满足,因为j的初始数值为1,说明i<1,不是合法i的位置
return ERROR;
e=p->data; //当找到位置之后 ,把该位置的数据域的内容给e
return OK;
}
四、算法时间复杂度
初始化:因为每一个操作只进行一遍,所以Tn=O(1);
取值:有可能第一次就可以取到数值,有可能一直循环到最后一次,取平均执行次数作为fn,所以Tn=O(n)。