错误写法:不能覆盖特殊情况的插入方法 写法:只用了一个指向当前节点的指针
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
int num;
LinkNode* next;
}Lk, * lk;
//有头链表的初始化
lk initLinkNode()
{
//创建头结点
lk headNode = (lk)malloc(sizeof(Lk));
//检验头结点分配内存是否成功
if (headNode == NULL)
{
return NULL;
}
//初始化头结点
headNode->num = -1; //头结点不维护数据域,这行代码可写可不写
headNode->next = NULL;
//记录节点位置,方便插入新的数据
lk currentNode = headNode;
//让用户输入几个数,如果输入-1,结束输入
int val = -1;
while (1)
{
printf("请给当前链表赋值,输入-1结束输入:n");
scanf("%d", &val);
if (val == -1)
{
break;
}
//开辟一个新节点存放数据
lk node = (lk)malloc(sizeof(Lk));
node->num = val;
node->next = NULL;
//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接
currentNode->next = node;
//将记录当前位置的指针指向新的节点
currentNode = currentNode->next;
}
return headNode;
}
//遍历链表
void for_each_linkList(lk headNode)
{
if (headNode == NULL)
{
return;
}
//利用一个记录当前节点的指针,来遍历输出整个链表
lk curNode = headNode->next;
//循环结束条件:curNode指针为空
while (curNode)
{
printf("%dn", curNode->num);
curNode = curNode->next;
}
}
//插入链表
void insert_LinkList(lk headNode,int oldVal,int newVal)
{
//第一种插入实现
if (headNode == NULL)
{
return;
}
//遍历链表查看链表中是否存储有oldval,有就将newval插入到oldval后面,没有就插入到链表结尾
//指向当前节点的指针
lk curNode = headNode->next;
while (curNode!=NULL)
{
if (curNode->num == oldVal)
{
break;
}
curNode = curNode->next;
}
//先按照正常找到的情况写出插入代码
//然后检查未找到,需要尾插的情况符不符合正常插入的代码
lk newNode = (lk)malloc(sizeof(Lk));
newNode->num = newVal;
//看图:
newNode->next = curNode->next;
curNode->next = newNode;
printf("插入成功");
}
int main()
{
lk headNode = initLinkNode();
insert_LinkList(headNode, 30, 100);
printf("链表遍历结果为:n");
for_each_linkList(headNode);
return 0;
}
正常找到oldVal插入的情况:可以成功实现
未找到oldVal,将newVal进行尾插的情况:访问权限冲突
正确写法:能够覆盖特殊情况
写法:用了两个一前一后的指针
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode
{
int num;
LinkNode* next;
}Lk, * lk;
//有头链表的初始化
lk initLinkNode()
{
//创建头结点
lk headNode = (lk)malloc(sizeof(Lk));
//检验头结点分配内存是否成功
if (headNode == NULL)
{
return NULL;
}
//初始化头结点
headNode->num = -1; //头结点不维护数据域,这行代码可写可不写
headNode->next = NULL;
//记录节点位置,方便插入新的数据
lk currentNode = headNode;
//让用户输入几个数,如果输入-1,结束输入
int val = -1;
while (1)
{
printf("请给当前链表赋值,输入-1结束输入:n");
scanf("%d", &val);
if (val == -1)
{
break;
}
//开辟一个新节点存放数据
lk node = (lk)malloc(sizeof(Lk));
node->num = val;
node->next = NULL;
//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接
currentNode->next = node;
//将记录当前位置的指针指向新的节点
currentNode = currentNode->next;
}
return headNode;
}
//遍历链表
void for_each_linkList(lk headNode)
{
if (headNode == NULL)
{
return;
}
//利用一个记录当前节点的指针,来遍历输出整个链表
lk curNode = headNode->next;
//循环结束条件:curNode指针为空
while (curNode)
{
printf("%dn", curNode->num);
curNode = curNode->next;
}
}
//插入链表
void insert_LinkList(lk headNode,int oldVal,int newVal)
{
//第一种插入实现
if (headNode == NULL)
{
return;
}
//遍历链表查看链表中是否存储有oldval,有就将newval插入到oldval前面,没有就插入到链表结尾
//一个指向头节点,一个指向第一个存储有效数据的节点
lk prveNode = headNode;
lk curNode = headNode->next;
//循环结束条件:当curNode指向NULL
while (curNode)
{
if (curNode->num == oldVal)
{
break;
}
//下面两行代码顺序不能改变
prveNode = curNode;
curNode = curNode->next;
}
//创建新节点存储newVal
lk newNode = (lk)malloc(sizeof(Lk));
newNode->num = newVal;
newNode->next = NULL;
//插入:下面两行代码可以改变顺序
prveNode->next = newNode;
newNode->next = curNode;
printf("插入成功");
}
int main()
{
lk headNode = initLinkNode();
insert_LinkList(headNode, 30, 100);
printf("链表遍历结果为:n");
for_each_linkList(headNode);
return 0;
}
正常找到oldVal插入的情况
未找到oldVal,将newVal进行尾插的情况