Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 链表初学者的基本建议是必要的_C_Struct_Linked List - Fatal编程技术网

C 链表初学者的基本建议是必要的

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

老师说写程序有四个功能(打印大小或添加、删除和打印节点)。第17行出现错误(无法将int*转换为节点)。我找不到其他方法来表示这条线,所以请帮忙。因为这是我第一次使用链表,所以您可能会遇到很多错误

#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)逐步检查代码以查看实际执行的操作。虽然这确实回答了问题,但代码中还有许多其他错误。