双链表C编程中的反向查看/搜索功能出现问题



嘿,伙计们,这是我第一次做双链表,所以我不太确定我在这里做什么,需要一些帮助来检查代码,谢谢,下面是我所做的,包括注释。我在这里做的功能是打印、反向打印、计数链表中的元素,以及确定该节点是否存在的搜索功能

 void printListfow() //print the list in forward manner
{
    CLR;
    struct node *tmpval; //declare a temp storage
    if(start==NULL) //if 1st node = null,then nth is inside,nth to print
    {
         printf("List is emptyn");
         return; 
    }
     tmpval=start; //assign the head/start to temp storage to retrieve data in 1st node
     printf("List of customer details: n");
     while(tmpval!=NULL) //keep doing till it is NULL/the end
     {
         printf("%d ", tmpval->detail); //print the 'detail' which is in the node temp is pointing at
         tmpval=tmpval->next; //assign next node to the temp storage so that it can be printed again
     }
}

void printListrev() //print in reverse manner
{
      CLR;
      struct node *tmpval; //temp storage
      if(start==NULL) //
      {
          printf("List is emptyn");
          return;
      }
      tmpval=start; //assign start to tmpval to retrieve value
      printf("List of customer details: n");
      tmpval=tmpval->prev //move backward and assign the data to tmpval
      printf("%d",tmpval->detail) //print it
}
void count() //count total number of records
{   struct node *x;
    x=start; //assign value of start to temp storage
    int ctr=0; //initialize counter
    while(x!=NULL) 
  {
    x=x->next; //keep going to next node and then increase the counter
    ctr++;
  }
  printf("Number of customer records are %dn",ctr);
}

int getNode(node *tmp ,int cust) //when user wants to delete a customer ID and its details, this will search through the list,then if found,pass the value to another function for deletion
{
    tmp=tmp->cust; 
    while(tmp!=NULL)
    {
        if(tmp->detail == cust) //check if detail[ID stored] is same as requested[cust]
        {
            return 1;
        }tmp=tmp->next; //if not same,then move to next one
    }return 0;
}

谢谢!

printListrev():的上下文中

除非这是一个循环的双链表,在这种情况下,最后一个元素前面是第一个元素,否则start的前一个元素将为NULL。因此,访问start的前一个字段没有意义,就像您在这里所做的那样:

tmpval=start;
...
tmpval=tmpval->prev;

为此,您可以保留另一个指向列表末尾的指针。

其他替代方案包括:

递归函数:

void printrev(struct node *s)
{
    if (s == NULL)
    return;
    printrev(s->next);
    printf("%d ", s->detail);
}

迭代函数:

void printrev()
{
    struct node *end;
    for (end = start; end->next != NULL; end = end->next)
    ;
    for (; end != NULL; end = end->prev)
    printf("%d ", end->detail);
}

您的getNode用途有限。假设,若要删除元素,则getnode只返回元素是否存在。假设它存在,那么在删除它之前,deleteNode函数仍然需要迭代到列表中的适当元素

这可以通过getNode返回指向节点的指针来解决:

node *getNode(int x)
{
    node *t;
    for (t = start; t != NULL; t = t->next)
        if (t->detail == x)
                return t;
    return t;
}

现在,您可以按如下方式代码删除:

void delNode(node *n)
{
    n->prev->next = n->next;
    n->next->prev = n->prev;
    free(n);
}

并按如下方式调用:

node *n;
if ((n = getNode(x)) != NULL)
    delNode(n);

我假设你的struct是:

struct node {
    int detail;
    struct node *next;
    struct node *right;
};
typedef struct node * node;
  • 在printListrev()中,您只打印一个不反向的节点
  • 您正在做的一个主要问题是在getNode()中,您正在更改本地指针的地址,但原始指针仍然指向它以前的位置
  • 如果是这样,那么您将如何删除该节点,因为在该函数返回后,您无法知道节点地址
  • 你会为所有节点调用getNode()吗?如果是的话,如果你有很多节点,那就不好了

相关内容

  • 没有找到相关文章

最新更新