【发布时间】:2015-09-06 03:07:24
【问题描述】:
老师说编写程序有四个功能(打印大小或添加、删除和打印节点)。第 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");
}
}
【问题讨论】:
-
除了
header的类型不正确,请仔细查看finder。给定任何非零的number,当您在上一行设置c = 0;时,您认为while(c==number)将循环多长时间?就此而言,您return adr;在函数的底部,但从不费心将其设置为任何确定的 anywhere。 -
在处理双向链表之前,最好先正确获取一个(“前向”)链表。此外,打印每个节点、其内容和指针值的某种
dump函数可能会帮助您调试链表操作。 -
强烈建议:编译时,始终启用所有警告。对于 gcc,至少使用:
-Wall -Wextra -pedantic然后修复那些警告,毕竟编译器比我们人类更了解 C 语言。对于发布的代码,编译器将引发几条消息,包括以下项目:/usr/include/stdiio.h:178:12:注意:先前的“删除”声明在这里是 I.E。remove()是一个系统函数,禁止编写自己的系统函数版本。建议更改您的函数名称,可能为deleteNextNode() -
建议在修复编译器指出的所有问题后,使用调试器(如 gdb)来单步调试代码以查看实际执行的操作。
标签: c struct linked-list