递归语言C中的链表添加元素 #包括 #包括 类型定义结构节点枚举 { int-num; 结构nodeNum*next; }t_nodeNum; //功能声明---------------------------- int菜单();//显示菜单和返回选项 t_nodeNum*加法(t_nodeNum*节点,int n); 作废打印列表(t_nodeNum*节点); // ---------------------------------------------------- //测试链接列表功能的主程序 int main() { 智力选择; t_nodeNum*pnode=NULL; t_nodeNum*head=NULL; t_nodeNum*temp=NULL; int numad=0; int len=0; int first=1; 做 { 选择=菜单(); 开关(选择) { 案例1: { printf(“请输入号码:\n”); scanf(“%d”&numad); 如果(第一) { pnode=(t_nodeNum*)malloc(sizeof(t_nodeNum)); if(pnode==NULL) { printf(“\n分配错误\n”); 出口(0); } pnode->num=numad; pnode->next=NULL; 第一个=0; 头=pnode; } pnode=加法(pnode,numad); 打破 } 案例4: { printf(“\n打印列表:”); 打印列表(标题); 打破 } } } while(选项!=5); 返回0; } //功能菜单显示菜单和返回选项 int菜单() { int-choice=0; 做 { printf(“请选择要执行的选项:\n”); printf(“1.添加\n”); printf(“2.删除\n”); printf(“3.search\n”); printf(“4.print\n”); printf(“5.退出\n”); printf(“\n option=”); scanf(“%d”,选择(&C); } 而(选择5); 回报选择; } //在递归中将项添加到链表的函数加法 t_nodeNum*加法(t_nodeNum*p,int numad) { int len=0; if(p==NULL) { p=(t_nodeNum*)malloc(sizeof(t_nodeNum)); if(p==NULL) { printf(“\n分配错误\n”); 出口(0); } p->num=numad; p->next=NULL; } 其他的 { p=添加(p->next,numad); } 回报率(p); } //函数print_list以递归方式打印链表 无效打印列表(t_nodeNum*头) { printf(“%d”,head->num); if(head->next==NULL) { printf(“\n”); 返回; } 打印列表(标题->下一步); }
添加功能有问题,无法正确地将新项目添加到链接列表中,我不知道有什么问题,请帮助递归语言C中的链表添加元素 #包括 #包括 类型定义结构节点枚举 { int-num; 结构nodeNum*next; }t_nodeNum; //功能声明---------------------------- int菜单();//显示菜单和返回选项 t_nodeNum*加法(t_nodeNum*节点,int n); 作废打印列表(t_nodeNum*节点); // ---------------------------------------------------- //测试链接列表功能的主程序 int main() { 智力选择; t_nodeNum*pnode=NULL; t_nodeNum*head=NULL; t_nodeNum*temp=NULL; int numad=0; int len=0; int first=1; 做 { 选择=菜单(); 开关(选择) { 案例1: { printf(“请输入号码:\n”); scanf(“%d”&numad); 如果(第一) { pnode=(t_nodeNum*)malloc(sizeof(t_nodeNum)); if(pnode==NULL) { printf(“\n分配错误\n”); 出口(0); } pnode->num=numad; pnode->next=NULL; 第一个=0; 头=pnode; } pnode=加法(pnode,numad); 打破 } 案例4: { printf(“\n打印列表:”); 打印列表(标题); 打破 } } } while(选项!=5); 返回0; } //功能菜单显示菜单和返回选项 int菜单() { int-choice=0; 做 { printf(“请选择要执行的选项:\n”); printf(“1.添加\n”); printf(“2.删除\n”); printf(“3.search\n”); printf(“4.print\n”); printf(“5.退出\n”); printf(“\n option=”); scanf(“%d”,选择(&C); } 而(选择5); 回报选择; } //在递归中将项添加到链表的函数加法 t_nodeNum*加法(t_nodeNum*p,int numad) { int len=0; if(p==NULL) { p=(t_nodeNum*)malloc(sizeof(t_nodeNum)); if(p==NULL) { printf(“\n分配错误\n”); 出口(0); } p->num=numad; p->next=NULL; } 其他的 { p=添加(p->next,numad); } 回报率(p); } //函数print_list以递归方式打印链表 无效打印列表(t_nodeNum*头) { printf(“%d”,head->num); if(head->next==NULL) { printf(“\n”); 返回; } 打印列表(标题->下一步); },c,list,recursion,hyperlink,C,List,Recursion,Hyperlink,添加功能有问题,无法正确地将新项目添加到链接列表中,我不知道有什么问题,请帮助 添加新项目并执行打印列表后,它仅显示主功能中的第一个项目- #include <stdio.h> #include <stdlib.h> typedef struct nodeNum { int num; struct nodeNum *next; } t_nodeNum; // Functions declaration -----------------------
添加新项目并执行打印列表后,它仅显示主功能中的第一个项目-
#include <stdio.h>
#include <stdlib.h>
typedef struct nodeNum
{
int num;
struct nodeNum *next;
} t_nodeNum;
// Functions declaration ----------------------------
int menu(); // display menu and return choice
t_nodeNum* addition(t_nodeNum *node, int n);
void print_list(t_nodeNum *node);
// ----------------------------------------------------
// Main program to test link list functions
int main()
{
int choice;
t_nodeNum *pnode = NULL;
t_nodeNum *head = NULL;
t_nodeNum *temp = NULL;
int numAdd = 0;
int len = 0;
int first = 1;
do
{
choice = menu();
switch (choice)
{
case 1:
{
printf("Please enter number : \n");
scanf("%d", &numAdd);
if (first)
{
pnode = (t_nodeNum *)malloc(sizeof(t_nodeNum));
if (pnode == NULL)
{
printf("\n Error in allocation\n");
exit(0);
}
pnode->num = numAdd;
pnode->next = NULL;
first = 0;
head = pnode;
}
pnode = addition(pnode, numAdd);
break;
}
case 4:
{
printf("\n Print List: ");
print_list(head);
break;
}
}
}
while (choice != 5);
return 0;
}
// function menu display menu and return choice
int menu()
{
int choice = 0;
do
{
printf("Please choose option to do: \n");
printf("1. addition\n");
printf("2. deletion\n");
printf("3. search\n");
printf("4. print\n");
printf("5. exit\n");
printf("\n option = ");
scanf("%d", &choice);
}
while (choice < 1 || choice > 5);
return choice;
}
// function addition to add item to linked list in recursion
t_nodeNum* addition(t_nodeNum *p, int numAdd)
{
int len = 0;
if (p == NULL)
{
p = (t_nodeNum *)malloc(sizeof(t_nodeNum));
if (p == NULL)
{
printf("\n Error in allocation\n");
exit(0);
}
p->num = numAdd;
p->next = NULL;
}
else
{
p = addition(p->next, numAdd);
}
return (p);
}
// function print_list to print linked list in recursion
void print_list(t_nodeNum *head)
{
printf("%d ", head->num);
if (head->next == NULL)
{
printf("\n");
return;
}
print_list(head->next);
}
您需要通过pnode->next
-
pnode = addition(pnode, numAdd);
第一个调用的问题是pnode
不是NULL
,所以它只是在头部位置添加新元素来替换以前的值并返回
因此,不会创建新节点 递归是错误的方法。如果有10000个节点呢?使用的堆栈内存将是巨大的。用指针迭代列表。@SteveWellens这里的所有递归都是尾部递归,不是吗?有三种情况需要处理:
p==NULL
,p->next==NULL
,和p->next=NULL
@Rhymoid在本例中,递归就是递归。解决这个问题的方法不好。@SteveWellens在addition
和print\u list
中的尾部递归可以被任何适当实现的尾部调用优化程序转换成简单的循环。此代码没有性能问题。唯一可能有问题的是可读性,但这是非常主观的;如果它在代码库中的使用非常一致,我完全赞成。剩下的另一个问题是它没有遵循MISRA C指南,但是这些指南已经过时了,因此不相关;但这并不能解决问题,还有一些问题仍然存在!!!
pnode = addition(pnode->next, numAdd);