这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战
考研算法必会
初始化操作
(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
//初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));
if(L!=NULL){
L->next = NULL;
return OK;
}
else{
return ERROR;
}
}
单链表获取某个元素
算法思路:
- 声明一个节点 p 指向链表的第一个节点,初始化 j 作为计数器,从 1 开始
- 当 j<i 的时候,遍历链表,让 p 不断向后移动,计数器 j+1
- 查找成功时,返回节点
- 当到了链表的末尾即 p 为空时,则说明第 i 个元素不存在
单链表按值查找结点值
//按值查找结点值
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p&&p->data!=e){
p=p->next;
}
return p;
}
代码分析:
注意代码的可读性和拓展性
单链表插入元素
在任意位置插入一个节点 s,数据域值为 e 的节点,要如何实现呢?
s->next = p->next; //第一步
p->next = s; //第二步
首先将 p 的后继节点 p->next 修改为 s 的后继节点,然后将节点 s 修改 p 的后继节点。 注意:顺序不能颠倒,如果颠倒了 p->next=s;s->next=p->next,这种情况下由于先断开了 p 与p->next之间的关系,进而导致了 s->next找不到后继节点。
单链表第 i 个数据插入节点的算法思想:
- 声明一个节点 p 指向链表的第一个节点,初始化 j 作为计数器从 1 开始。
- 当 j<i 时,遍历链表,使 p 指针向后移动,不断指向下一个节点,此时 j+1。 3. 如果遍历到链表尾部,则说明第 i 个元素不存在。
- 否则查找成功,创建一个空节点 s。
- 将数据 e 赋值给 s->data。
- 单链表插入:s->next = p->next; p->next = s;。
- 返回成功,算法结束。
单链表插入节点操作代码实现
//插入节点操作
//求链表长度
int LinkLen(LinkList L,int i=0){
LinkList *Node;
while(L->next!=NULL){
i++;
L=L->next;
}
return i;
}
LinkList InsertElem(LinkList &L,int i){
int length;
length=LinkLen(L);
if(i>0&&i<=length){
LNode *node;
int x;
scanf("%d",&x);
node->data=x;
LNode *p = L->next;
for(int j=1;j<i;j++){
p=p->next;
}
node->next=p->next;
p->next=node;
}
return L;
}