好友
阅读权限20
听众
最后登录1970-1-1
|
ing
发表于 2019-12-28 14:27
本帖最后由 ing 于 2019-12-29 11:22 编辑
我不理解为什么最后返回 p(原链表) 的值会是{0,1,2,3,4,5}而不是{0,1,2,3,4}----原链表 p {0,1,2,3,4}
在for循环结束后,临时指针 temp 只剩下了{4},代码 temp->next = e 运行完后,则为{4,5}
上图可以看到,原链表 p 已经多了个“5”了,可我一直操作的是 临时指针temp,
这个值是怎么加上去的?为什么不是{4,5}而是{0,1,2,3,4,5}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Link
{
int elem;
//代表指针域,指向后继元素
struct Link * next;
}link;
link * initLink();
//链表插入的函数,p是链表,elem是插入的结点的数据域,add是插入的位置
link * insertElem(link * p,int elem,int add);
void display(link *p);
int main()
{
//初始化链表(1,2,3,4)
printf("初始化链表为:\n");
link *p=initLink();
display(p);
printf("在第6的位置插入元素5:\n");
p = insertElem(p,5,6);
display(p);
}
link *initLink()
{
//头节点创建
link * p = (link*)malloc(sizeof(link));
//声明一个指针指向头节点
link * temp = p;
//生成链表
for (int i = 0; i < 5; ++i)
{
//节点 a 创建
link * a = (link *)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
/* 头指针指向当前深度的结点,再让当前深度的结点作为头结点 */
//↓↓↓↓↓↓↓↓
p->next = a; //每执行一次结点深度+1
p = p->next;
//↑↑↑↑↑↑↑↑
}
//返回指针
return temp;
}
//p为原链表,elem表示新数据元素,add表示新元素要插入的位置
link * insertElem(link *p,int elem, int add)
{
//创建临时节点
link * temp = p;
//找到要插入位置上的结点
for (int i = 1; i < add; ++i) {
//判断用户输入的插入位置是否有效
if (temp==NULL)
{
printf("插入的位置无效");
return p;
}
//达到指定位置(结点深度),每执行一次都会只剩下当前位置和后继元素
//例如{0,1,2,3,4}执行一次后变成{1,2,3,4}
temp = temp->next;
//{{0,1,2,3,4}} = {1,2,3,4}
}
link * e = (link *)malloc(sizeof(link));
e->elem = elem;
//向链表中插入结点
e->next = temp->next;
temp->next = e;
return p;
}
void display(link *p){
link* temp=p;
while (temp->next) {
temp=temp->next;
printf("%d",temp->elem);
}
printf("\n");
}
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|