#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node * next; } Node; void pushBackList(Node ** pList, int data) { Node * p; Node * newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (*pList == NULL) { *pList = newNode; return; } for (p=*pList; p->next!=NULL; p=p->next) ; void printList(Node * p) { for (; p!=NULL; p=p->next) { printf("%d ", p->data); } puts(""); }void freeList(Node ** pList) { Node * p = *pList; while (p!=NULL) { Node * t = p; p=p->next; free(t); } *pList = NULL; } int sizeList(Node * p) {: int i; for (i=0; p!=NULL; p=p->next) i++; return i; } int main(void) { Node * list = NULL; pushBackList(&list, 10); pushBackList(&list, 20); pushBackList(&list, 30); pushBackList(&list, 40); printList(list); printf("size = %d\n", sizeList(list)); freeList(&list); return 0; }解释一下
时间: 2024-03-08 12:44:54 浏览: 64
这是一个使用链表实现的简单程序,其中包含了以下几个函数:
1. pushBackList: 实现向链表末尾添加新节点的功能。该函数接收一个指向指针的指针 pList 和一个整数 data,用于将 data 新增为链表的一部分。如果链表为空,则将新节点作为链表的第一个节点;否则,遍历链表直到到达链表末尾,将新节点添加到链表的末尾。
2. printList: 实现遍历链表并输出链表中各节点的 data 值的功能。该函数接收一个指向链表的指针 p,并通过循环遍历链表中的每个节点,输出节点的 data 值。
3. freeList: 实现释放链表内存的功能。该函数接收一个指向指针的指针 pList,通过循环遍历链表,依次释放链表中每个节点的内存空间,并将链表的头节点指针指向 NULL。
4. sizeList: 实现计算链表长度的功能。该函数接收一个指向链表的指针 p,通过循环遍历链表,计算链表中节点的数量,并返回该值。
在 main 函数中,首先定义了一个空链表 list,然后通过 pushBackList 函数向链表中添加了四个节点,每个节点的 data 值分别为 10、20、30、40。接着调用 printList 函数输出链表中的节点数据,并使用 sizeList 函数计算链表长度。最后调用 freeList 函数释放链表内存。
相关问题
完善以下代码:#include <stdio.h> #include <stdlib.h> typedef struct node { void *data; struct node *next; }NODE; NODE * find_circular_of_list(NODE *head) { }
以下是完善后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
void *data;
struct node *next;
} NODE;
NODE* find_circular_of_list(NODE* head) {
if (head == NULL) { // 链表为空,无法找到环
return NULL;
}
NODE* fast = head;
NODE* slow = head;
while (fast != NULL && fast->next != NULL) { // 快慢指针找到相遇点
fast = fast->next->next;
slow = slow->next;
if (fast == slow) {
break;
}
}
if (fast == NULL || fast->next == NULL) { // 没有环
return NULL;
}
NODE* ptr1 = head;
NODE* ptr2 = fast;
while (ptr1 != ptr2) { // 从头指针和相遇点指针同时出发,相遇点即为环的入口
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
return ptr1;
}
```
这个函数的目的是在给定的链表中查找环的入口节点。如果链表不包含环,则返回 `NULL`。在实现中,我们使用了快慢指针的技巧。快指针每次移动两步,慢指针每次移动一步,如果链表中存在环,则二者最终会在环上相遇。接着,我们让两个指针同时从头节点和相遇节点出发,每次移动一个节点,当它们再次相遇时,就是环的入口节点。
简化#include<stdio.h> #include<stdlib.h> //定义数据类型,假设为int typedef int ElemType; //定义自引用结构体(结点) struct node { ElemType data; struct node *next; }; //typedef为了简写struct node typedef struct node Node; /** * 链表各种函数的声明 */ //创建链表函数声明 Node *CreatList(); /
下面是简化后的代码:
```
typedef int ElemType;
typedef struct node {
ElemType data;
struct node *next;
} Node;
Node *CreatList();
```
阅读全文