void Delete_num(STU** p_head, long long num) { STU* pb, * pf;//pb:指定删除的节点,pf:中间节点 pb = pf = *p_head; if (*p_head == NULL)//链表为空,不用删 { printf("链表为空,没有您要删的节点"); return; } while (pb->num != num && pb->next != NULL)//循环找要删除的节点 { pf = pb; pb = pb->next; } if (pb->num == num)//找到了一个节点的num和num相同 { if (pb == *p_head)//要删除的节点是头节点 { //让保存头结点的指针保存后一个结点的地址 *p_head = pb->next; } else { //前一个结点的指针域保存要删除的后一个结点的地址 pf->next = pb->next; } //释放空间 free(pb); pb = NULL; } else//没有找到 { printf("没有您要删除的节点\n"); } }
时间: 2024-04-11 16:30:02 浏览: 113
这段代码是用于删除指定学号的节点的函数Delete_num的定义。
函数的参数包括一个指向指针的指针p_head,表示链表的首地址;num表示要删除的学号。
函数首先定义了两个指针pb和pf,它们分别指向链表的首节点,并且初始化为*p_head。
接着进行判断,如果链表为空(即*p_head为NULL),则输出"链表为空,没有您要删的节点"的提示信息,并返回。
进入循环,当pb结点的学号不等于要删除的学号,并且pb的下一个结点不为空时,继续循环。在循环中,pf保存pb的值,然后将pb指向下一个结点。
循环结束后,判断pb结点的学号是否等于要删除的学号。如果相等,则表示找到了要删除的节点。
接下来进行判断,如果pb是头节点(即pb等于*p_head),则将*p_head指向pb的下一个节点,即让保存头结点的指针保存后一个结点的地址。
否则,将前一个结点pf的next指针指向pb的下一个节点,即前一个结点的指针域保存要删除的后一个结点的地址。
最后,释放pb所指向的节点的空间,将pb置为NULL。
如果循环结束时pb结点的学号不等于要删除的学号,则表示没有找到要删除的节点,输出"没有您要删除的节点"的提示信息。
需要注意的是,函数中使用了free函数释放节点的空间,以及对链表头节点的操作。这些操作需要根据实际情况进行补充。
相关问题
void link_creat_head(STU **p_head,STU *p_new)
`void link_creat_head(STU **p_head, STU *p_new)` 这段代码是一个函数声明,它在C语言中用于链表的操作。其中 `STU** p_head` 表示一个指向指针的指针,通常用于链表的头结点,因为链表的头需要存储另一个节点的地址;`STU *p_new` 则是要插入的新节点。
这个函数的作用可能是用来将新节点 `p_new` 赋值给链表的头部 (`*p_head`),并更新头指针。如果 `p_head` 指向的是空列表(即未初始化或者链表为空),那么这将创建一个新的链表;如果 `p_head` 已经有内容,那么 `p_new` 将成为新的链表头部。
具体实现会涉及到对指针的操作,例如检查链表是否为空、设置 `p_head` 等。下面是简化的伪代码描述:
```c
if (*p_head == NULL) { // 如果链表为空
*p_head = p_new; // 新节点成为头节点
} else {
STU *temp = *p_head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = p_new; // 新节点添加到链表尾部
}
```
#include <stdio.h> #include <stdlib.h> /*其它说明*/ #include <string.h> /*字符串函数*/ #include <time.h> #define LEN sizeof(STUDENT) typedef struct stu /*定义结构体数组用于缓存数据*/ { char num[6]; //学号 char name[5]; //姓名 int score[3]; //三科成绩 int sum; //总成绩 float average; //平均成绩 int order; //排序 int order1; //排名 struct stu *next; } STUDENT; STUDENT *Init();/*初始化函数*/ int Menu_Select();/*菜单选择函数*/ STUDENT *Create(); /*输入函数*/ void Print(STUDENT *head); /* 显示全部记录函数*/ void Search(STUDENT *head);/*查找记录函数*/ STUDENT *Modify(STUDENT *head);/*修改记录函数*/ STUDENT *Delete(STUDENT *head);/*删除记录函数*/ STUDENT *Sort(STUDENT *head);/*排序函数*/ STUDENT *Insert(STUDENT *head, STUDENT *New); /*插入记录函数*//*TODO: 排序排名 功能描述: 按照降序给链表排序,排序存在order,排名存在order1 参数说明:head-STUDENT型指针 返回值说明:STUDENT型指针 */ STUDENT *Sort(STUDENT *head) { return (head); }补全函数
这个函数似乎没有实现排序排名的功能,我来帮你补充一下:
```
STUDENT *Sort(STUDENT *head)
{
STUDENT *p, *q, *tail;
int len = 0, i, j;
// 获取链表长度
for (p = head; p != NULL; p = p->next) {
len++;
}
// 外层循环控制比较轮数
for (i = 0; i < len - 1; i++) {
tail = head;
p = head->next;
q = p;
// 内层循环进行两两比较
for (j = 0; j < len - i - 1; j++) {
if (p->sum > q->sum) {
// 交换节点数据
if (p == head->next) {
head->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
} else {
tail->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
}
} else {
tail = p;
p = q;
q = p->next;
}
}
}
// 排名
p = head;
for (i = 1; i <= len; i++) {
p->order = i;
p = p->next;
}
// 排序完成,返回头节点
return head;
}
```
这个函数的实现思路是使用冒泡排序对链表进行排序,同时进行排名。排序的依据是每个节点的 `sum` 字段,也就是总成绩。排完序之后,遍历链表,给每个节点的 `order1` 字段赋上相应的排名即可。
阅读全文
相关推荐

















