head->next=p;和head=p->next的区别
时间: 2024-06-04 13:06:14 浏览: 176
假设这里的`head`和`p`都是指向链表节点的指针。
`head->next=p;`的作用是将`head`所指向节点的下一个节点设置为`p`所指向的节点。也就是说,将`p`插入到`head`所指节点之后。
而`head=p->next;`的作用是将`p`所指向节点的下一个节点作为新的头节点,也就是将链表的头节点指向`p`的下一个节点。
两者的区别是,第一个语句将`p`插入到`head`所指节点之后,而第二个语句则是将链表的头节点更新为`p`的下一个节点。这两个语句的作用不同,所以在具体的链表操作中需要根据实际情况选择使用哪一个。
相关问题
void MySort(StudentNode** s){ StudentNode* p = *s;StudentNode* temp; int lenth = 0; // 判断特殊情况 长度为1 if((p -> next == NULL)) { printf("长度为1,无需排序!\n"); return; } // 判断特殊情况 长度为2 if((p -> next -> next == NULL)) { if(p->ID < p->next->ID){ temp = p; // 保存头节点 *s = (*s)->next; // 头节点换为下一个节点 (*s)->next = temp; (*s)->next->next = NULL; } printf("排序完成! \n"); return; } // 获取长度 while(1) { lenth++; if(p->next == NULL){ // 退出 break; } p = p->next; } printf("长度为%d !\n", lenth); // 冒泡排序 StudentNode* head = *s; StudentNode* pre = *s; // 当前 StudentNode* cur = (*s)->next; // 当前 +1 StudentNode* next = (*s)->next->next; // 当前 + 2 StudentNode* end = NULL; for (int i = lenth; i >= 0; i--) { pre = head; cur = pre->next; next = cur->next; while(next != NULL) { if (cur->ID > next->ID) { cur->next = next->next; pre->next = next; next->next = cur; next = cur->next; pre = pre->next; } else { pre = pre->next; cur = cur->next; next = next->next; } } } // 头结点 排序 head = *s; cur = *s; // 当前 // cur到尾巴 while(cur->next != NULL){ // 大于上一个,小于下一个 if(head->ID > cur->ID && head->ID < cur->next->ID ){ // 头节点换为下一个节点 *s = (*s)->next; // 插入 head temp = cur->next; cur->next = head; head->next = temp; printf("头排序完成!\n"); printf("排序完成!\n"); return; } cur = cur->next; // 往下走 } // 单独比较尾巴 if(head->ID > cur->ID){ // 头节点换为下一个节点 *s = (*s)->next; cur->next = head; head->next = NULL; printf("头排序完成!\n"); } printf("排序完成!\n"); }是什么意思
这是一个使用冒泡排序算法对链表中的学生节点按照ID从小到大进行排序的函数。该函数接受一个指向指针的指针,表示链表的头部指针的地址。
函数中的代码实现了以下步骤:
1. 判断特殊情况:如果链表长度为1或2,则无需排序,直接返回。
2. 获取链表长度,并输出长度信息。
3. 使用冒泡排序算法对链表中的学生节点进行排序,直到链表中所有节点都按照ID从小到大排列。
4. 考虑头结点和尾节点的特殊情况。如果头节点比第二个节点小,则头节点不需要移动;否则,将头节点换为下一个节点。如果头节点比尾节点大,则将头节点移动到尾部。
5. 输出排序完成信息。
需要注意的是,函数中的printf语句只是为了输出调试信息,实际使用时可以删除。函数中的变量命名比较简单易懂,可以通过变量名理解代码的含义。
#include<stdio.h> #include<stdlib.h> struct data{ int num; char name[10]; int result; struct data * next; }; struct data *head,*tail; struct data *Creat_Stu_Doc(); struct data *DeleteDoc(struct data *head,int score); void Ptrint_Stu_Doc(struct data *head); int main() { int score; Creat_Stu_Doc(); scanf("%d",&score); DeleteDoc(head,score); return 0; } struct data *Creat_Stu_Doc() { struct data *p; int num; scanf("%d",&num); head=tail=NULL; while(num!=0){ p=(struct data *)malloc(sizeof(struct data)); p->num=num; scanf("%s",p->name); scanf("%d",&p->result); if(head==NULL){ head=tail=p; } else{ tail->next=p; tail=p; } scanf("%d",&num); } tail->next=NULL; return head; } struct data *DeleteDoc(struct data *head,int score) { struct data *p,*q; p=head; while(p!=NULL){ if(p==head){ if(p->result<score){ head=p->next; free(p); p=head; } } else { if((p->next)->result<score){ p->next=(p->next)->next; q=p; free(q); } } p=p->next; } } void Ptrint_Stu_Doc(struct data *head) { struct data *p; p=head; while(p->next!=NULL){ printf("%d %s %d\n",p->num,p->name,p->result); } }
这是一段 C 语言代码,它的功能是创建一个链表,然后删除链表中所有成绩低于指定分数的节点,并输出剩余节点的信息。具体来说,代码中定义了一个结构体 `data`,包含了学生的学号、姓名和成绩,以及指向下一个节点的指针。通过函数 `Creat_Stu_Doc()` 可以创建一个链表,并返回链表的头指针;通过函数 `DeleteDoc()` 可以删除链表中所有成绩低于指定分数的节点;通过函数 `Ptrint_Stu_Doc()` 可以输出链表中剩余节点的信息。在 `main()` 函数中,首先调用 `Creat_Stu_Doc()` 函数创建链表,然后通过 `scanf()` 函数读入一个分数,接着调用 `DeleteDoc()` 函数删除链表中所有成绩低于该分数的节点,最后程序结束。
阅读全文