c语言的数据结构中,next是如何指向下一个元素的?
typedef struct LNode //定义结构体
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status AddOneRecord(LinkList &head,ElemType e)//尾插入法
{
LNode *p, *q;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;
p->data=e;
q=head;
while(q->next!=NULL)
q=q->next ;
q->next =p;
return ok ;
}
例子中, p->next如何指向下一个元素的?如果将指针命名为*n而不是*next,是不是也能达到这个效果? 展开
在函数中不是有q->next=p;这时q是插入前的尾节点。那样q的的下一个(新插入的节点)就由q指向节点里的字段next指向了。
单链表的插入只需让s->next 和p->next的指针做一点改变即可。
s->next = p->next;
p->next = s;
单链表第i个数据插入结点的算法思路是:
1、声明一个指针p指向链表的第一个结点,初始化j从1开始;
2、当j< i 时,遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
3、若到链表末尾p为空,说明第i个元素不存在;
4、否则查找成功,在系统中生成一个空结点s;
5、将数据元素e赋值给s->data;
6、单链表的插入标准语句 s->next = p->next; p->next = s;
7、返回成功。
扩展资料
单链表的建立有头插法、尾插法两种方法。
1、头插法
单链表是用户不断申请存储单元和改变链接关系而得到的一种特殊数据结构,将链表的左边称为链头,右边称为链尾。头插法建单链表是将链表右端看成固定的,链表不断向左延伸而得到的。头插法最先得到的是尾结点。
链表建立的过程是申请空间、得到数据、建立链接的循环处理过程。
2、尾插法
若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头指针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针pl。尾插法最先得到的是头结点。
指针的声明
指向类型 *p;
这个*就标志这这是一个指针,声明之后,变量p在调用的时候就不是调的指针本体了,而是指针所指的目标!
例如:p->next
这不是指针p的next,而是指针p所指向的目标中的next
结构体作为自定义的数据结构,创建后系统只能返回整个结构体的首地址,所以只能用一个指针来接,结构体中指针变量命名为next只是国际惯例,你就算改成*n也一样,只是以后用的时候:
p->next 改成 p->n 就可以了
指针赋值常用的有两种:
1、把目标的地址取来赋给指针
p = & target //&就是取地址符
2、把另一个指针所指向的目标的地址赋给指针
p = q;
这个P->next为什么表示指向下一个呢?如果用线性表可以用++i什么的来指向下一个,可是这个没有类似的啊!而且双向链表中,定义改变了一下,
typedef struct DuLNode //定义结构体
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
然后p->prior就表求指向p的前一个元素,这是怎么做到的啊?在我看来,next和prior的定义是一样的形式,怎么会有不同的效果呢?
p也是可以执行++操作的,意思就是访问p指针所在内存地址的下一个地址中的数据,但是这个p指针变量是独立声明的,他的下一个地址里面是什么数据你是不知道的,所以单独的p++是没有意义的。
你所说的线性表,我理解为就是数组或者在物理地址上是连续的一种存储结构,在物理地址与逻辑地址存在关联的时候,p++才有意义,因为你知道,当前地址下一个地址中的数据,就是你线性表中下一个数据。
p++并不是单纯的线性向下探索一个物理地址,它会根据p所指向的数据类型来判断++到底是向下探测几个,比如int *p,那p++就是向下探测一个,如果是你这样的DuLNode *p,就是计算出一个结构体一共需要多少个地址空间,这时的++就是向下探测一个结构体的空间,去寻找下一个结构体,当然,前提是物理地之上,这两个结构体是挨着的!!!
而链表最大的特性就是:节点可以不是物理连续的,他们靠指针来串起来,让你可以从逻辑上认为是连续的一个整体。
关于你的第二个问题:“然后p->prior就表求指向p的前...”
独立来看一个结构体是没有意义的,它里面的*prior、*next仅仅是一个变量,它可以被赋成任何地址,至于它是否能够成为一个双向链表的节点,是由你在实际创建的过程中决定的。
你创建了节点A,并认为它是头节点
然后创建了节点B,作为第二个节点,
并把A的地址赋给B的prior,这时,prior才成为B的前一个节点
同样,把B的地址赋给A的next,这时,A的next才成为了A的下一个节点
以此类推....
假如你将A的prior和next全设为B,B的prior和next全设为A,那么这就建立了一个最简单的环形链表,所以结构体及其变量具体代表什么意思,是看你怎么用来决定的
那这个指向操作是怎么进行的呢?还有,next 是个指针,p也是指针,“指针—>指针”表示什么意思啊
p是定义在函数体局部变量,他可以指向一个指针节点,而next是定义在struct(结构体)内的字段(术语忘了,应该是这么叫的)。
p是局部变量,在函数体内可以调用它,可以使用它来使用结构体内的字段,p->next就是p所指向的struct里面字段next;
而next是定义在struct内的字段,不能再函数内直接使用,只能使用指向那struct的指针或那个struct的名来间接访问它。
太晚了,有点困,说的有点乱,不知道能不能看懂,建议你去学习学习链表和结构体的知识。