【问题标题】:adding two nodes and deleting one while comparing it [closed]添加两个节点并在比较时删除一个[关闭]
【发布时间】:2012-10-10 17:21:10
【问题描述】:

在链接列表中,我想将每个节点与另一个节点进行比较,如果它们相似,则将它们加在一起。我在遍历链表然后加在一起时遇到问题。

我的 main.cpp:

  #include <cstdlib>
  #include "list.h"
  int main(){
  Poly poly=new_list();
  Poly poly2=new_list();
  Poly merged= new_list();
  int n;
  int deg;
  float coef;
  n=1;
  while (n==1)
     {
      cout<<"Enter coefficient ";
      cin>> coef;
      cout<<"Enter degree ";
      cin>>deg;
      insert_front(&poly,coef,deg);
      cout<<"Enter 1 to continue or 0 to break ";
      cin>>n;
  }
  print_list(poly);
  cout<<"sorted\n";
  reduce(poly);

}

这是我的头文件:

//list.h                                                                       
#include <iostream>
using namespace std;
#ifndef LIST_H
#define LIST_H
struct Term {
    int deg;
    float coef;
    Term *next;
};
typedef Term* Poly;
Poly new_list();
void insert_front(Poly* ppoly,int deg, float coef);
void print_list(Poly poly);
void delete_front(Poly* ppoly);
bool is_empty(Poly poly);
Poly merge(Poly *ppoly,Poly *ppoly2);
void split_list(Poly* ppoly,Poly *ppoly2);
void mergesort(Poly* pl);
void reduce(Poly poly);
#endif

我拥有所有的函数,可以将用户系数和多项式的次数打印出来,还可以将它们从最低到最高的次数归并排序。

功能:

list.cpp
#include "list.h" 聚 new_list(){ 多聚 = 0; 返回聚; } void insert_front(Poly* ppoly,int deg, float coef){ 术语* t; t = 新术语; t->coef=coef; t->度=度; t->下一个 = *ppoly; *多聚 = t; 返回; } 无效打印列表(聚聚){ 术语* p; p = 聚; 如果(p == 0) cout deg下一个; } cout t = (*ppoly); *ppoly = (*ppoly)->下一个; 删除 t; } }

bool is_empty(Poly poly){
  return (poly == 0); //return true if list empty                                                                                                                                                                                 
}

Poly merge(Poly* ppoly, Poly* ppoly2){
    Term **pp;
    Poly merged, list1,list2;
    merged= new_list();
    list1 = *ppoly;
    list2 = *ppoly2;
    pp= &merged;
    while(list1 != NULL && list2 != NULL){
        if(list2->coef > list1->coef){
           *pp = list1;
           list1 = list1->next;
           (*pp)->next = NULL;
        }else{
           *pp = list2;
           list2 = list2->next;
           (*pp)->next = NULL;
        }
        pp = &( (*pp)->next );
    }
    if(list1 != NULL)
        *pp = list1;
    if(list2 != NULL)
        *pp = list2;

    *ppoly = NULL;
    *ppoly2 = NULL;
    return merged;
}
void split_list(Poly* ppoly, Poly* ppoly2){
    Poly l1= *ppoly;
    Poly l2= *ppoly;
    Poly* pp = &l1;
    while( l2 != NULL){
        l2 = l2->next;
        if(l2 != NULL){
            l2 = l2->next;
            pp = &((*pp)->next);
        }
    }
    l2 = *pp;
    (*pp) = NULL;
    *ppoly=l1;
    *ppoly2=l2;
}
void mergesort(Poly* pl){
    Poly l1 = *pl;
    Poly l2 = new_list();
    Poly merged = new_list();
    if(l1 == NULL || l1->next == NULL)
        return; //sorted or empty                                                                                                                                                                                                 
    split_list(&l1,&l2);
    mergesort(&l1);
    mergesort(&l2);
    merged = merge(&l1,&l2);
    *pl = merged;
}
void reduce(Poly poly){
  mergesort(&poly);
  print_list(poly);
  int i=0;
  cout<<"combining like terms:"<<endl;
  Term* p;
  p=poly;
  if (p==0)
    cout<<"---empty list---";
  while(i=0){
    if (poly->coef==(poly->next)->coef){
      p->deg=(poly->deg)+((poly->next)->deg);
      poly=p;
      i=1;
    }
  }
  print_list(poly);
}

我已经这样做了几天,但无法正常工作。问题出在reduce() 函数中。

例如,如果我有:2x^2+2x^2+4x^2+3x^5,它将打印8x^2+3x^5

【问题讨论】:

    标签: c++ linked-list nodes


    【解决方案1】:

    这里有很多问题。让我们从一个简单的案例开始:

    int main()
    {
      Poly poly=new_list();
    
      insert_front(&poly,2,5);
      insert_front(&poly,2,5);
    
      reduce(poly);
      print_list(poly); // we hope for 4x^5
    
      return(0);
    }
    

    ...但我们得到 2x^5。 (请注意,如果可能,您应该单独测试一个函数——不需要交互或合并或所有其他东西。)

    现在看reduce

    void reduce(Poly poly){
      mergesort(&poly);
      print_list(poly);
      int i=0;
      cout<<"combining like terms:"<<endl;
      Term* p;
      p=poly;
      if (p==0)
        cout<<"---empty list---";
      while(i=0){
        if (poly->coef==(poly->next)->coef){
          p->deg=(poly->deg)+((poly->next)->deg);
          poly=p;
          i=1;
        }
      }
      print_list(poly);
    }
    

    你有“ceof”和“degree”的错误方式,但这只是变量命名的问题(尽管这让我的眼睛受伤)。

    你使用while(i=0),我认为你的意思是while(i==0)。正如所写,这是一个评估为0 的赋值,因此控制永远不会进入循环。假设我们修复了这个问题,以便我们进入循环:

    int i=0;
    Term* p;
    p=poly;
    while(i==0){
      if (poly->coef==(poly->next)->coef){
        p->deg=(poly->deg)+((poly->next)->deg);
        poly=p;
        i=1;
      }
    }
    

    如果前两项不匹配,i 将保持为零,我们将永远处于循环中。
    如果前两个术语匹配,i=1 并且我们退出循环,因此不会考虑其他术语。
    在离开循环之前,我们修改第一项——然后设置poly=p。但是poly 已经等于p;这一步什么都不做,第二个任期还在。

    我希望这足以让你朝着正确的方向前进。

    【讨论】:

    • 并非如此。我仍然不知道如何使这个循环遍历所有元素,如果它们的度数相同,那么它们将添加而其他元素将保持不变。例如,如果我有 2x^2+2x^2 它将打印 4x^2+ 2x^2 为什么它不删除 2x^2。如果我有 2x^2+2x^2+1x^2,它会打印 4x^2+2x^2+1x^2。它不会将三件事加在一起
    • @CZ,从简单到复杂:实现(并测试)removeTerm 函数。而且你知道如何编写可以遍历列表的东西——看看print_list
    • 我知道我应该使用 'while(p!=0)' 但它会崩溃
    • print_list 不会崩溃。让removeTerm 完美运行,然后将其集成到reduce
    • @CZ,阅读我写的内容:实现(并测试)removeTerm 函数,一个从列表中删除术语的函数。为了让它更简单:它接受一个Term* 作为参数,并删除那个after这个词。在确定您对单个术语所做的操作是正确的之前,不要担心迭代列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多