C 链表初学者的基本建议是必要的
老师说写程序有四个功能(打印大小或添加、删除和打印节点)。第17行出现错误(无法将int*转换为节点)。我找不到其他方法来表示这条线,所以请帮忙。因为这是我第一次使用链表,所以您可能会遇到很多错误C 链表初学者的基本建议是必要的,c,struct,linked-list,C,Struct,Linked List,老师说写程序有四个功能(打印大小或添加、删除和打印节点)。第17行出现错误(无法将int*转换为节点)。我找不到其他方法来表示这条线,所以请帮忙。因为这是我第一次使用链表,所以您可能会遇到很多错误 #include<conio.h> #include<stdio.h> #include<stdlib.h> struct node{ // Declaring the node (2 way) int n; struc
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
struct node{ // Declaring the node (2 way)
int n;
struct node *next;
struct node *prev;
};
int *header; //Declaring header and size counter
int size;
int *finder(int number) //Function that return address of selected node
{
int *adr;
int c;
struct node *temp;
temp=header;
c=0;
while(c==number)
{
temp=temp->next;
c=c+1;
}
return adr;
}
void insert(int data,int number) //insert new node after specified node
{
int *adr;
adr=finder(number);
struct node *current;
struct node *previous;
struct node *temp;
temp=(struct node *)malloc(sizeof(struct node));
current=adr;
previous=current->prev;
temp->n=data;
temp->next=current;
temp->prev=current->prev;
previous->next=temp;
current->prev=temp;
size=size+1;
}
void remove(int number) //remove node after selected one
{
int *adr;
adr=finder(number);
struct node *current;
struct node *previous;
struct node *neeext;
current=adr;
previous= current->prev;
neeext= current->next;
previous->next= neeext;
neeext->prev= previous;
}
void print(int number) //print data of node
{
int *adr;
adr=finder(number);
struct node *current;
printf("%d",current->n);
}
int main() //main function
{
int i,j,d;
size=0;
for(i=1;i<5;i=i+0)
{
if(i==1)
{
printf("%d",size);
}
scanf("%d",&j);
if(i==2)
{
scanf("%d",&d);
insert(d,j);
printf("inserted");
}
if(i==3)
{
remove(j);
printf("removed");
}
if(i==4)
{
print(j);
}
if(i==5)
{
return 0;
}
scanf("%d",&i);
printf("\n");
}
}
#包括
#包括
#包括
结构节点{//声明节点(2路)
int n;
结构节点*下一步;
结构节点*prev;
};
int*头//声明标头和大小计数器
整数大小;
int*finder(int number)//返回所选节点地址的函数
{
int*adr;
INTC;
结构节点*temp;
温度=收割台;
c=0;
while(c==数字)
{
温度=温度->下一步;
c=c+1;
}
返回adr;
}
void insert(int data,int number)//在指定节点后插入新节点
{
int*adr;
adr=查找器(编号);
结构节点*当前;
结构节点*previous;
结构节点*temp;
temp=(结构节点*)malloc(sizeof(结构节点));
电流=adr;
上一个=当前->上一个;
温度->n=数据;
温度->下一步=当前;
临时->上一个=当前->上一个;
上一个->下一个=温度;
当前->上一个=温度;
尺寸=尺寸+1;
}
void remove(int number)//删除选定节点后的节点
{
int*adr;
adr=查找器(编号);
结构节点*当前;
结构节点*previous;
结构节点*neext;
电流=adr;
上一个=当前->上一个;
NEEXT=当前->下一步;
上一个->下一个=下一个;
NEEXT->prev=上一个;
}
作废打印(整数)//打印节点数据
{
int*adr;
adr=查找器(编号);
结构节点*当前;
printf(“%d”,当前->n);
}
int main()//主函数
{
int i,j,d;
尺寸=0;
对于(i=1;i您应该将头
变量声明为struct node*header;
,而不是int*
除了头
的类型不正确之外,仔细查看查找器
。给定任何非零的number
,您认为而(c==number)需要多长时间
在上一行设置c=0;
时会循环吗?因此,您在函数底部返回adr;
,但不要麻烦将其设置为任何确定的值。最好是获得一个('forward')在处理双向链表之前,请先更正链表。此外,打印每个节点、其内容和指针值的某种类型的dump
函数可能有助于调试链表操作。请看一看强烈建议:编译时,始终启用所有警告。对于gcc,至少使用:-Wall-Wextra-pedantic
然后修复这些警告,毕竟,编译器比我们人类更了解C语言。对于发布的代码,编译器将发出几条消息,包括:/usr/include/stdiio.h:178:12:注意:前面的“remove”声明在这里,即remove()
是一个系统函数,不能编写自己版本的系统函数。建议更改函数名称,可能是deleteNextNode()
建议在修复编译器注意到的所有问题后,使用调试器(如gdb)逐步检查代码以查看实际执行的操作。虽然这确实回答了问题,但代码中还有许多其他错误。