【问题标题】:Linked list basic advice for beginner is needed需要给初学者的链表基本建议
【发布时间】: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


【解决方案1】:

您应该将header 变量声明为struct node *header;,而不是int*

【讨论】:

  • 虽然这确实回答了问题,但代码还有许多其他问题。
猜你喜欢
  • 2011-04-19
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2011-11-27
  • 2010-11-01
相关资源
最近更新 更多