关于链表的原理——我的逻辑有点混乱,高手帮忙解释一下。

ScorpioZZR 2003-08-18 11:16:52
有个很菜的问题要问一下。

关于链表的,以下程序是实现链表的增、删的功能。我的问题不在于程序本身,而在于对链表指针的疑问上。
链表只是一种逻辑上的数据结构,比如creat那段函数里,逻辑上是加一个就移动一下指针。然后不断后续,形成一个链表。
我的不理解就在于其实创建函数中,指针就那么两个p1和p2,当p1往后移动时,我总是会觉得因为它的移动导致了前面已经建立好的“联系”(就是“关联”)会因为指针的移动又被破坏掉了。
不知道我的意思表达清了没有,我的错误思路是:假设人的两条腿是那个指针p1和p2,人在地面上行走就好比指针在链表中不断的移动……我的疑问就是,指针既然已经移动掉了,那前面已经被建立的链会因为指针的移动而重新丢失掉。但实际上却不会,为什么呢?


-------

#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;/*n为全局变量,本模块中各函数均可使用它*/

struct student *creat(void) /*建立动态链表*/
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);/*开辟一个新单元*/
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if (n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
scanf ("%ld,%f",&p1->num,&p1->score );
}
p2->next=NULL;
return head;
}

void print(struct student *head) /*输出链表的函数*/
{
struct student *p;
printf("\nNow,These %d records are:\n",n);
p=head;
if (head!=NULL)
do
{
printf("%ld %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL);
}

struct student *del(struct student *head,long num) /*删除结点的函数*/
{
struct student *p1,*p2;
if (head==NULL)
{
printf("\nlist null! \n");
return head;
}
p1=head;
while(num!=p1->num&&p1->next!=NULL)/*p1指向的不是所要找的结点,并且后面还有结点*/
{
p2=p1;
p1=p1->next;/*p1后移一个结点*/
}
if (num==p1->num)/*找到了*/
{
if(p1==head)head=p1->next;/*若p1指向的是首结点,把第二个结点地址赋予head*/
else p2->next=p1->next;/*否则将下一个结点地址赋给前一结点地址*/
printf("delete:%ld\n",num);
n=n-1;
}
else printf("%ld not been found! \n",num);/*找不到该结点*/
return head;
}

struct student *insert(struct student *head,struct student *stud) /*插入结点的函数*/
{
struct student *p0,*p1,*p2;
p1=head; /*使p1指向第一个结点*/
p0=stud; /*使p0指向要插入的结点*/
if (head==NULL) /*原来的链表是空表*/
{
head=p0;
p0->next=NULL; /*使p0指向的结点作为头结点*/
}
else
{
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1; /*使p2指向刚才p1指向的结点*/
p1=p1->next; /*p1后移一个结点*/
}
if (p0->num<p1->num)
{
if (head==p1)head=p0; /*插到原来第一个结点之前*/
else p2->next=p0; /*插到p2指向的结点之后*/
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL; /*插到最后的结点之后*/
}
}
n=n+1; /*结点数加1*/
return head;
}
...全文
116 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2003-08-19
  • 打赏
  • 举报
回复
两条腿走路,腿是跑了,脚印还在。
最好的办法,自己拿几个纸片,写上数据,按照操作顺序,比划一下,可以帮助你理解。
mmmcd 2003-08-19
  • 打赏
  • 举报
回复
指针变量里的值当然会消失
一移动,里面存放的地址就变了啊,
但 指针变量所存放的 地址里的 东西没变啊

好像你对指针还一窍不通。

你知道这句是干什么用的?不用行不行?
p1=p2=(struct student *)malloc(LEN);/*开辟一个新单元*/
ScorpioZZR 2003-08-19
  • 打赏
  • 举报
回复
为什么指针变量里的值会没有消失,明明只有两个指针变量啊,一移动,里面存放的地址就变了啊 !
ScorpioZZR 2003-08-19
  • 打赏
  • 举报
回复
可是,我总是觉得比如这样吧。
i=2;
i=3;
i=4;
这样,每次i的值都被冲走了啊?!
「已注销」 2003-08-19
  • 打赏
  • 举报
回复
有一点要搞清楚,你所指的指针p2和p1,是变量,也就是指针变量,所以其内容只要是指针就可以存放进来。而它连接进来的全部都是一些实实在在的存储单元(存储单元不是变量,地址是实际存在的),一旦这些单元已经建立了前后的联系,那么这个变量要不要已经不重要了。就比如把很多针通过线联系起来,如果针与针之间已经建立了联系,那么不管当初建立这个联系的工具是不是存在,这个联系都不会断掉。这是一个道理。
mmmcd 2003-08-19
  • 打赏
  • 举报
回复
链建立在:(struct student *)malloc(LEN);/*开辟一个新单元*/
开辟的单元里。

用指针只是访问这样的单元,再没别的意义。
mmmcd 2003-08-19
  • 打赏
  • 举报
回复
假设人的两条腿是那个指针p1和p2,
人在地面上行走就好比指针在链表中不断的移动

假设人在走过的地面上画了格子,人走了,地上的格子没变化

指针既然已经移动掉了,
只是指针变了,它指向的内存没变化

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧