//销毁单链表 void DestoryList(Lnode *L){ Linklist pre=L,p=L->next; while(p!=NULL){ free(pre); pre=p; p=pre->next; } free(pre); } //判断链表是否为空 bool ListEmpty(Lnode *L){ return (L->next==NULL); }
时间: 2024-04-14 20:28:46 浏览: 103
你提供的代码包含了两个函数,一个用于销毁单链表,另一个用于判断链表是否为空。这些函数的实现看起来是正确的。
函数`DestoryList`用于销毁单链表。它通过遍历链表并释放每个节点的内存来实现销毁。在遍历过程中,你使用两个指针`pre`和`p`,其中`pre`指向当前节点的前一个节点,`p`指向当前节点。在每次循环迭代中,你首先释放`pre`指向的节点,然后更新`pre`和`p`指向下一个节点。最后,你释放了最后一个节点并将整个链表销毁。
函数`ListEmpty`用于判断链表是否为空。它通过检查链表的头节点的下一个指针是否为NULL来判断链表是否为空。如果下一个指针为NULL,则链表为空,函数返回true;否则,链表不为空,函数返回false。
这些函数看起来没有问题。如果你有其他问题或需要进一步帮助,请随时提问。
相关问题
6-7 移动链表中的最大值到尾部 分数 10 编写函数MoveMaxToTail(),实现查找单链表中值最大的结点,并将其移动到链表尾部,注意其他结点的相对次序不变。要求尽量具有较高的时间效率。 例如输入8 12 46 30 5,输出为8 12 30 5 46 函数接口定义: void MoveMaxToTail (LinkList H ); 裁判测试程序样例: #include<stdio.h> #include<stdlib.h> typedef int DataType; struct Node { DataType data; struct Node* next; }; typedef struct Node *PNode; typedef struct Node *LinkList; void MoveMaxToTail(head); LinkList SetNullList_Link() { LinkList head = (LinkList)malloc(sizeof(struct Node)); if (head != NULL) head->next = NULL; else printf("alloc failure"); return head; } void CreateList_Tail(struct Node* head) { PNode p = NULL; PNode q = head; DataType data; scanf("%d", &data); while (data != -1) { p = (struct Node*)malloc(sizeof(struct Node)); p->data = data; p->next = NULL; q->next = p; q = p; scanf("%d", &data); } } void MoveMaxToTail (LinkList H ) { @@ } void print(LinkList head) { PNode p = head->next; while (p) { printf("%d ", p->data); p = p->next; } } void DestoryList_Link(LinkList head) { PNode pre = head; PNode p = pre->next; while (p) { free(pre); pre = p; p = pre->next; } free(pre); } int main() { LinkList head = NULL; head = SetNullList_Link(); CreateList_Tail(head); MoveMaxToTail(head); print(head); DestoryList_Link(head); return 0; }
下面是实现 MoveMaxToTail 函数的代码:
```c
void MoveMaxToTail (LinkList H ) {
if (H == NULL || H->next == NULL) return; // 链表为空或只有一个结点,直接返回
PNode p = H->next, maxNode = p, preMaxNode = H; // p 从第一个结点开始,maxNode 记录最大值结点,preMaxNode 记录前驱结点
while (p->next) { // 从第二个结点开始遍历
if (p->next->data > maxNode->data) {
maxNode = p->next; // 更新最大值结点
preMaxNode = p; // 更新前驱结点
}
p = p->next;
}
if (maxNode != p) { // 若最大值结点不是尾结点
preMaxNode->next = maxNode->next; // 从链表中删除最大值结点
maxNode->next = NULL; // 将最大值结点置为尾结点
p->next = maxNode; // 将最大值结点插入到尾结点后面
}
}
```
该函数的时间复杂度为 O(n),其中 n 是链表的长度。
struct Student { int class_num; char id[15]; char name[10]; float score[3]; float sum; float course_av[3]; float course_pass[3]; float course_max[3]; float course_min[3]; }; //链表节点定义 struct Node { struct Student student; struct Node* next; }; //链表定义 struct List { struct Node* head; //链表头节点 int size; //链表长度 }; struct List* createList(); //创建链表 void destoryList(struct List* list); //销毁链表 struct Node* createNode(struct Student student); //创建节点 struct Node* getLastNode(struct List* list); //获取链表最后一个节点 struct Node* getBeforeNode(struct List* list, struct Student student); //获取上一个节点 void addList(struct List* list, struct Node* node); //将节点添加到链表中 #endif 这是个什么数据结构?看起来不像单链表
这是一个单链表的实现,每个链表节点包含一个 `struct Student` 类型的数据,以及一个指向下一个节点的指针 `next`。链表的头节点定义在 `struct List` 中的 `head` 中,链表的长度定义在 `struct List` 中的 `size` 中。函数包括创建链表、销毁链表、创建节点、获取最后一个节点、获取上一个节点、将节点添加到链表中等操作。
阅读全文