2016-04-01 7 views
0

Polinomları temsil eden bağlantı listesi oluşturmaya çalışıyorum. Her düğüm, bir sonraki düğümün düğümüne bağlanma katsayısından, katsayıdan oluşur. Bu programı çalıştığı argümanları geçmeden denedim. ancak bağımsız değişkenleri iletmeye çalışırken bağlantı listesi oluşturulmuyor. lütfen programımı düzeltmek için yardımcı ..neden bir bağlantı listesi düğümü oluşturan bir işlevde yapı işaretçisi argümanını geçiyor?

***** BU INSERT FONKSİYONLARINDAKİ BİR argüman olarak YAPI işaretçileri ile MY PROGRAMINI IS *****


#include<stdio.h> 
#include<stdlib.h> 

struct node 
{ 
float coff; 
int expo; 
struct node *next; 
}; 

struct node *start1=NULL,*current1=NULL; 

void insert(struct node *start,struct node *current) 
{ 
struct node *new_node; 

new_node=(struct node*)malloc(sizeof(struct node)); 

if(start==NULL) 
{ 
    start=new_node; 
    current=new_node; 
} 
else 
{ 
    current->next=new_node; 
    current=new_node; 
} 

printf("\nEnter coefficient:"); 
scanf("%f",&new_node->coff); 
printf("\nEnter power of x:"); 
scanf("%d",&new_node->expo); 
new_node->next=NULL; 
} 
void show(struct node *start) 
{ 
struct node *ptr; 
ptr=start; 

    while(ptr!=NULL) 
    { 
     printf(" %.2fx^%d",ptr->coff,ptr->expo); 
     ptr=ptr->next; 
    } 
} 
void find(float scoff,int sexpo,struct node *start) 
{ 
//scoff=search coefficient, sexpo=search exponent 
int flag=0; 
    struct node *ptr; 
    ptr=start; 

    while(ptr!=NULL) 
    { 
     if(ptr->coff==scoff && ptr->expo==sexpo) 
     { 
      printf("your term found-> %.1fx^%d",ptr->coff,ptr->expo); 
      flag=1; 
      break; 
     } 
     else 
     ptr=ptr->next; 
    } 

    if(flag==0) 
     printf("\nSorry term couldn't be found!!"); 
    else 
     printf("\nSearch success!!"); 

} 
int main() 
{ 
int c=1,ex=0; 
float cf=0; 
while(1) 
{ 
    insert(start1,current1); 
    printf("\nWant to continue(1/0)?"); 
    scanf("%d",&c); 
     if(c==0) 
      break; 
} 
show(start1); 
while(1) 
{ 
    printf("\nEnter coff and expo respectively:"); 
    scanf("%f%d",&cf,&ex); 
    find(cf,ex,start1); 

    printf("\nWant to continue(1/0)?"); 
    scanf("%d",&c); 
     if(c==0) 
      break; 
} 

return 0; 
} 

cevap

1

sorun başlangıç ​​ve geçerli işaretçilerin (yani işlev argümanları olarak iletilen kopyalar) yerel bir kopyasını değiştiriyorsunuz, bu yüzden bağlantılı listeyi gerçekten değiştirmiyorsunuz. Bunun yerine, start1 ve current1 işaretçilerini değiştirmeniz gerekir. Genel değişkenleri basitçe değiştirebildiğinden, ekleme işlevinin start ve current parametrelerini almasına gerek yoktur. (Bunun kötü bir tasarım tercihi olduğuna dikkat edilmelidir.)

if (start==NULL) 
{ 
    start=new_node; 
    current=new_node; 
} 

yılında listesi hazırlanırken sadece tahrip olur yerel kopyayı değiştirdiğinizde

Daha spesifik olarak, sorunun bu kapsam dışına çıktığında . İşlev döndükten sonra start1 ve current1 hala NULL vardır. Bu değişikliğinden sonra, işlevin küresel değişkenler üzerinde işlem gibi (parametreleri olması insert için yani gerek yoktur) insert() çağırabilirsiniz:

Savulun

void insert(struct node *start,struct node *current) 
{ 
struct node *new_node; 

new_node=(struct node*)malloc(sizeof(struct node)); 

if(start1==NULL) 
{ 
    start1=new_node; // You previously had start instead of start1 
    current1=new_node; // You previously had current instead of current1 
} 
else 
{ 
    current1->next=new_node; 
    current1=new_node; 
} 

printf("\nEnter coefficient:"); 
scanf("%f",&new_node->coff); 
printf("\nEnter power of x:"); 
scanf("%d",&new_node->expo); 
new_node->next=NULL; 
} 

insert fonksiyonunu değiştirme

. Diğer seçenek --- daha iyi, ancak daha fazla zaman alan --- bir şekilde bağlantılı listeyi başlatabilir ve daha sonra işlevleri mevcut formunda kullanır (küçük değişiklikler hariç).

İlgili konular