一、单链表的定义
线性表的链式存储
typedef struct LNode{//typedef用于重命名一个数据类型
int data;//数据
struct LNode *next;//指向下一个节点的指针
}LNode,*LinkList;
二、基本操作
1.头插法
代码如下(示例):
LinkList Insert_Head(LinkList &L){
LNode *s;int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;//将x赋值给s指针中的数据对象
s->next=L->next;//将s指针中的下一个节点对象连接到L的next上
L->next=s;//将s装进L的next里面
}
return L;
}
以下图片仅为个人记忆方法和逻辑理解
王道书中的图片是那种连接的锁链结构,但是个人觉得应该是这种嵌套结构,第一个节点放进链表头结点的next指针中,再插入新节点时,将之前放进去的节点掏出来放进新的节点next指针中,再将这个新节点放进链表头结点的next指针中
2.按序号/值查找节点值
从第一个节点出发,直到找到第i个节点为止,超出范围返回最后一个节点的指针域NULL
代码如下(示例):
LNode *GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;//定义一个指向头节点指针域的指针
if(i==0)
return L;
if(i<0)
return NULL;
while(P!==NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
3.尾插法
LinkList Insert_Tail(LinkList &L){
LNode *s,*r;int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
r=L;
scanf("%d",x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",x);
}
r->next=NULL;
return L;
}
仅个人理解方式和记忆方法
与头插法的不同在于将新节点放入链表头结点的next指针中后,又定义了一个节点类型的指针r,将r指向放入链表头结点的next指针中的新节点
总结
对于链表部分的学习,个人认为写代码要比看懂更加重要,像头插法的思想可以用于将原链表进行逆置。