【问题标题】:Circular LinkedList循环链表
【发布时间】:2012-10-11 20:33:34
【问题描述】:

我对循环链表没什么问题:我想在最后插入一个元素(整数)。我的函数在末尾添加元素,但我的链表并不是真正的循环(我有这种印象)。 这是我使用的结构的 .h:

struct liste_circulaire {
  int val;
  struct liste_circulaire *suivant; /* suivant = next element */
};

typedef struct liste_circulaire liste;

    int main(void) {
  liste *l, *deb;
  deb = (liste *)malloc(sizeof(liste));
  l = deb;
  l -> suivant = deb;  /* suivant = next element */
  ajouter_element(l,0);
  ajouter_element(l,1);
  ajouter_element(l,2);
  ajouter_element(l,3);
  affiche(l,l->suivant);
  printf("%d\n",l->suivant->suivant->suivant->suivant->suivant->val);
  return 0;
}
void ajouter_element(liste *l,int x) {  
  liste *deb = l;  /* with this line, I have a pointeur on the first element of my list */
    while(l->suivant != deb) {    
      l = l -> suivant;
    }
  l -> suivant = (liste *)malloc(sizeof(liste));
  l = l -> suivant;
  l -> val = x;  
  l -> suivant = deb;
}

void affiche(liste *l,liste *deb) {
  if(l == deb) {
    printf(" Fin\n");
    return;
  }
  printf(" %d -->",deb->val);
  affiche(l,deb->suivant);
}

在我的主要内容中,当我要求打印列表的第一个元素时,我有随机数,但在我的示例中,列表的第一个值是 0。所以如果有人可以帮助我(我希望清楚,我是法国学生)谢谢!

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    由于这个原因,您的程序正在打印一个随机数:

    liste *l, *deb;
    deb = (liste *)malloc(sizeof(liste));
    l = deb;
    l -> suivant = deb; 
    

    列表中的第一个元素是您正确分配但没有给出任何数字的节点。您应该尝试添加:

    l -> val = 0; 
    

    并摆脱:

    ajouter_element(l,0);
    

    这应该可以解决您的问题。

    【讨论】:

      【解决方案2】:

      循环链表可以使用预定义的头文件list.h

      以下链接包含如何操作的example

      list.h 包含所有与管理循环链表相关的函数,如定义、添加头部、添加尾部、删除、foreach 函数以浏览循环链表...

      【讨论】:

        【解决方案3】:

        请注意,您永远不会设置第一个元素的值。 (Hernan 刚刚在这里打败了我……)

        当您调用 ajouter_element() 时,它不仅将新元素添加到列表的末尾,还将列表的开头设置为新元素:

        l = l -> suivant;

        affiche() 先打印第二个元素,最后打印第一个元素。首先要打印的是deb->val,主要是l->suivant->val


        如果您希望affiche() 打印第一项...打印它! :]

        void affiche(liste *l,liste *deb) {
          if (deb == 0)
          {
            deb = l;
          }
        
          printf(" %d -->",l->val);
        
          if(l->suivant == deb) {
            printf(" Fin\n");
            return;
          }
        
          affiche(l->suivant,deb);
        }
        

        调用它:

        affiche(l,0);
        

        affiche(l,l);
        

        他们都会做同样的事情。您也可以重载它以仅采用单个值。

        我还没有运行它(甚至没有编译),但希望它相当接近。

        【讨论】:

        • 感谢您的回答,但我总是遇到函数 affiche(打印我的链接列表)的问题。我知道第一个元素不是打印。为了解决这个问题,我是否改变了调用我的函数affiche的方式?
        • Okeeeeey 我放弃了递归版本,我有一个非常有效的命令式版本 :) 感谢您的帮助
        • 谢谢!!我明白为什么我的最后一个功能不起作用!我保留递归版本,最好使用命令式编程!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多