关于c的动态链表,其中代码p2=p1不是整体赋值吗,还是只是数据域的赋值不包含指针域的赋值?

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);

这里p2,p1都是结构指针,其值就是结构变量的地址,或者说是某个链表节点的地址,p2=p1,就是让p2指向p1所指向的那个节点,也就是2和指针指向同一个节点,而节点本身数据不变。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-08-13
p2 = p1;是指针赋值,即将指针p1的值赋指针p2,物理意义是使p2和p1指向同一个目标,并不是整体赋值。本回答被提问者和网友采纳
第2个回答  2019-08-13
// singlelist.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
// singlelist.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <conio.h>
using namespace std;

typedef struct student
{
int data;
struct student *next;
}node;

node *creat() //建立一个单链表
{
node *head,*p,*s;
int x,cycle=1;
head=(node*)malloc(sizeof(node));
p=head;
while(cycle)
{
cout<<"Please input the data:";
cin>>x;
if (x!=0)
{
s=(node*)malloc(sizeof(node));
s->data=x;
//cout<<s->data;
p->next=s;
p=s;
}
else
cycle=0;
}
head=head->next;
p->next=NULL;
cout<<head->data;
return head;
}

int length(node *head) //测试单链表的长度
{
int n=0;
node *p;
p=head;
while(p!=NULL)
{
p=p->next;
n++;
}
return n;
}

void print(node *head) //打印单链表
{
node *p;
int n;
n=length(head);
cout<<"These"<<n<<"records are: "<<endl;
p=head;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}

node *del(node *head,int num) //单链表删除节点
{
node *p1,*p2;
p1=head;
while(num!=p1->data&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if (num==p1->data)
{
if (p1==head)
{
head=p1->next;
free(p1);
}
else
p2->next=p1->next;
}
else
cout<<num<<"could not been found!"<<endl;
return head;
}

node *insert(node *head,int num) //单链表插入节点
{
node *p0,*p1,*p2;
p1=head;
p0=(node *)malloc(sizeof(node));
p0->data=num;
while(p0->data>p1->data&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if (p0->data<=p1->data)
{
if (p1==head) //插入到链表头
{
p0->next=p1;
head=p0;
}
else{ //插入到中间
p2->next=p0;
p0->next=p1;
}
}
else //插入到尾节点
{
p1->next=p0;
p0->next=NULL;
}
return head;
}

node *sort(node *head) //单链表的排序
{
node *p;
int n;
int temp;
n=length(head);
if (head==NULL||head->next==NULL)
{
return head;
}
p=head;
for (int i=1;i<n;++i)
{
p=head;
for(int j=0;j<n-i;++j)
{
if (p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p=p->next;
}
}
return head;
}

node *reverse(node *head) //单链表的逆转
{
node *p1,*p2,*p3;
if (head==NULL||head->next==NULL)
{
return head;
}
p1=head;
p2=p1->next;
while(p2)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
head->next=NULL;
head=p1;
return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
node *head;
int del_num,insert_num;
head=creat();
cout<<"长度为:"<<length(head)<<endl;
print(head);
head=sort(head);
print(head);
cout<<"输入要插入的数字:";
cin>>insert_num;
head=insert(head,insert_num);
print(head);
cout<<"请输入要删除的数字:";
cin>>del_num;
head=del(head, del_num);
print(head);
head=reverse(head);
print(head);
return 0;

---------------------
第3个回答  2019-08-13
指针变量保存的是地址,不同指针变量间的赋值是拷贝源指针变量保存的地址到目标指针变量的空间。最终使它们指向同一块内存的首地址。
相似回答