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

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

关于链表的,以下程序是实现链表的增、删的功能。我的问题不在于程序本身,而在于对链表指针的疑问上。
链表只是一种逻辑上的数据结构,比如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;
}
...全文
52 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ScorpioZZR 2003-08-19
  • 打赏
  • 举报
回复
怎么又mark??555····
XBug 2003-08-19
  • 打赏
  • 举报
回复
指针是在移动,但是建立起来的关系是由struct student 结构体里面的*next指针维持的
而不是由*p1,*p2维持,明白吗?
pengzhenwanli 2003-08-19
  • 打赏
  • 举报
回复
mark
ScorpioZZR 2003-08-19
  • 打赏
  • 举报
回复
为什么指针变量里的值会没有消失,明明只有两个指针变量啊,一移动,里面存放的地址就变了啊 !
ScorpioZZR 2003-08-19
  • 打赏
  • 举报
回复
可是,我总是觉得比如这样吧。
i=2;
i=3;
i=4;
这样,每次i的值都被冲走了啊?!
a6806 2003-08-19
  • 打赏
  • 举报
回复
不是,next是指针,存储的是一个内存地址,所以是4个字节。
hbzx 2003-08-19
  • 打赏
  • 举报
回复
我是把struct student *next理解成student结构里保存的一个8位地址

不知道对不对
csdn5211 2003-08-19
  • 打赏
  • 举报
回复
以creat为例

struct student
{
long num;
float score;
struct student *next;
};
struct student *next是干什么用的呢?你没想过吗?是它连接着链表的每一个节点。
p2->next=p1;这一句连上了新节点,从这以后p1和p2怎样移动也改变不了这种连接。
指针指针嘛,只是指指而已。

jakelove 2003-08-18
  • 打赏
  • 举报
回复
你和我是两个相互独立的人,我们互不认识,没有任何联系,而你和你的女朋友就有一种亲密的关系。虽然你们也是两个独立的人,可是,你们之间有一东西将你们联系在一起,那就是恋人的关系。

两个建立的数据之间也没有任何关系,而将它们联系在一起的是那个指向下一数据的指针,"***->next"。如果将它去掉那么这两个数据就是互不相关的,而加上它,就可以组成一张链表。
bbcallen 2003-08-18
  • 打赏
  • 举报
回复
上一级台阶和你的腿都在下一级台阶上
如果你移动你的腿的话,台阶不会跟着动
bbcallen 2003-08-18
  • 打赏
  • 举报
回复
你两条腿并不属于那个楼梯,只是在楼梯上面走而已
'->'这个东东才标志着台阶

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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