以C++的方式用递归的方法创建一个带头结点的单链表,遍历输出该单链表,并求出链表中的最大整数,结点个数,所以整数的平均值(double)和删除所以值为给定值x的结点
时间: 2024-05-02 09:19:56 浏览: 104
好的,我可以为您解答有关此问题的内容。
以下是C语言递归方式创建带头节点的单链表的代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node{
int data; //数据域
struct Node *next; //指针域
}Node;
// 初始化带头节点的单链表
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node)); //创建头结点
head->next = NULL; //指向空指针,初始为空链表
return head;
}
// 递归方式插入链表结点
void insert(Node *node, int data){
if(node->next == NULL){ //如果链表为空,则新建一个结点
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
node->next = newNode;
}
else{ //递归调用插入函数,寻找下一个空结点进行插入
insert(node->next, data);
}
}
// 遍历链表并输出结点数据
void traverse(Node *node){
if(node->next == NULL) //如果链表为空,则直接退出
return;
else{
printf("%d ", node->next->data); //输出结点数据
traverse(node->next); //递归调用遍历函数,寻找下一个结点
}
}
// 删除链表中指定数值x的结点
void delete(Node *node, int x){
if(node->next == NULL) //如果链表为空,则退出
return;
else{
//如果下一个结点数值等于x,则删除下一个结点,并将当前结点指向下一个结点的下一个结点
if(node->next->data == x){
Node *tmp = node->next;
node->next = node->next->next;
free(tmp);
delete(node, x); //继续递归删除下一个结点
}
else
delete(node->next, x); //下一个结点数据不为x,则继续递归删除下一个结点
}
}
// 获得链表结点个数
int count(Node *node){
if(node->next == NULL) //如果链表为空,则返回0
return 0;
else{
return 1 + count(node->next); //递归调用count函数,返回下一个结点的结点数加1
}
}
// 获得链表中的最大整数
int getMax(Node *node){
int max;
if(node->next == NULL) //如果链表为空,则返回0
return 0;
else{
max = node->next->data;
while(node->next != NULL){
if(node->next->data > max)
max = node->next->data;
node = node->next;
}
}
return max;
}
// 获得链表中整数的平均值
double getAvg(Node *node){
int sum = 0;
int num = 0;
double avg;
if(node->next == NULL) //如果链表为空,则返回0
return 0;
else{
while(node->next != NULL){
sum += node->next->data;
node = node->next;
num++;
}
avg = (double)sum / num;
}
return avg;
}
int main(){
int i;
Node *head = initList(); //初始化带头节点的单链表
//使用递归方式插入链表结点
for(i = 1; i <= 10; i++){
insert(head, i);
}
printf("链表结点数据为:");
traverse(head); //遍历链表并输出结点数据
printf("\n");
printf("链表结点个数为:%d\n", count(head)); //获得链表结点个数
printf("链表中的最大整数为:%d\n", getMax(head)); //获得链表中的最大整数
printf("链表中整数的平均值为:%f\n", getAvg(head)); //获得链表中整数的平均值
delete(head, 8); //删除链表中值为8的结点
printf("删除值为8的结点后的链表结点数据为:");
traverse(head); //遍历链表并输出结点数据
printf("\n");
return 0;
}
```
如果您有其他问题,请随时提出。
阅读全文