2015-12-03 64 views
1

我使用鏈表進行隊列實現..需要不使用命令gcc歐米茄警告編譯代碼在編譯時分配從兼容的指針類型 - std = c89 -g -pedantic filename.c。不過,我收到警告:從分配兼容的指針類型[默認啓用]就行號(174,223,253)。另外,我面臨的問題,在打印記錄到文件中:警告:使用gcc -std = C89 -g -pedantic FILENAME.C

#include <stdio.h> 
#include <errno.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <string.h> 

struct student_record 
{ 
     int student_id_; 
     int student_age_; 
     char first_name_[21]; 
     char last_name_[21]; 
}; 

struct student_record_node 
{ 
     struct student_record* record_; 
     struct student_record_node* next_; 
}*front,*rear,*temp,*front1; 

void enq(struct student_record* sr); 
void parseFile(char* filename, struct student_record_node** head); 
void printNode(struct student_record_node* node); 
struct student_record_node* student_record_allocate(); 
void student_record_node_deallocate(struct student_record_node* node); 
void sortByAge(struct student_record_node** recordsHead); 
void sortById(struct student_record_node** front); 
void swap(struct student_record_node** node1, struct student_record_node** node2); 

int main (int argc, char *argv[]) 
{ 
     char *filename = argv[1]; 
     int i; 

    /**for(i=0;i<argc;i++)**/ 
    /**   printf("%d %s ",i,argv[i]);**/ 


    /**printf("usage: %s filename", argv[1]);**/ 
    parseFile(filename,&front); 
    printNode(front); 

    printf("\n"); 
    printf("Sorting by age \n"); 
    sortByAge(&front); 
    printNode(front); 

    printf("Sorting by id \n"); 
    sortById(&front); 
    printNode(front); 

    /**student_record_node_deallocate(front);**/ 
    getch(); 
    return 0; 
} 

void swap(struct student_record_node** node1, struct student_record_node** node2) 
{ 
    struct student_record *s1; 
    struct student_record_node *t1 = *node1,*t2=*node2; 

    /**s1=(struct node *)malloc(1*sizeof(struct student_record));**/ 

    s1= t1 -> record_; 

    t1->record_= t2->record_; 
    t2->record_=s1; 

} 

void sortByAge(struct student_record_node** front) 
{ 
    int swapped, i; 
    struct student_record_node *ptr1; 
    struct student_record_node *lptr = NULL; 
    struct student_record *s1,*s2; 

    /**Checking for empty list**/ 
    if (ptr1 == NULL) 
     return; 

    do 
    { 
     swapped = 0; 
     ptr1 = *front; 

     while (ptr1->next_ != lptr) 
     { 
      s1=ptr1->record_; 
      s2=ptr1->next_->record_; 
      if (s1->student_age_ > s2->student_age_) 
      { 
       swap(&ptr1, &ptr1->next_); 
       swapped = 1; 
      } 
      ptr1 = ptr1->next_; 
     } 
     lptr = ptr1; 
    } 
    while (swapped); 



} 

void sortById(struct student_record_node** front) 
{ 
    int swapped, i; 
    struct student_record_node *ptr1; 
    struct student_record_node *lptr = NULL; 
    struct student_record *s1,*s2; 

    /**Checking for empty list**/ 
    if (ptr1 == NULL) 
     return; 

    do 
    { 
     swapped = 0; 
     ptr1 = *front; 

     while (ptr1->next_ != lptr) 
     { 
      s1=ptr1->record_; 
      s2=ptr1->next_->record_; 
      if (s1->student_id_ > s2->student_id_) 
      { 
       swap(&ptr1, &ptr1->next_); 
       swapped = 1; 
      } 
      ptr1 = ptr1->next_; 
     } 
     lptr = ptr1; 
    } 
    while (swapped); 



} 



void student_record_node_deallocate(struct student_record_node* node) 
{ 
    front1 = node; 
    struct student_record_node* temp; 


    if ((front1 == NULL) && (rear == NULL)) 
    { 
     printf("Queue is empty"); 
     return; 
    } 
    while (front1 != rear) 
    { 
     temp =front1; 
     front1 = front1->next_; 
     free(temp); 

    } 
    if (front1 == rear) 
     { 
     free(front1); 
     } 

    free(node); 
    free(temp); 

} 

struct student_record_node* student_record_allocate() 
{ 
struct student_record_node* sr; 
sr = (struct node *)malloc(1*sizeof(struct student_record_node)); 
return sr; 

} 

void printNode(struct student_record_node* node) 
{ 
    front1 = front; 
    struct student_record* s; 


    if ((front1 == NULL) && (rear == NULL)) 
    { 
     printf("Queue is empty"); 
     return; 
    } 
    while (front1 != rear) 
    { 
     s=front1->record_; 
     printf("struct student_record_node\n"); 
     printf("\tstudent firstname %s\n", s->first_name_); 
     printf("\tstudent lastname %s\n", s->last_name_); 
     printf("\tstudent id %d\n", s->student_id_); 
     printf("\tstudent age %d\n\n", s->student_age_); 
     front1 = front1->next_; 
    } 
    if (front1 == rear) 
     { 
     s=front1->record_; 
     printf("struct student_record_node\n"); 
     printf("\tstudent firstname %s\n", s->first_name_); 
     printf("\tstudent lastname %s\n", s->last_name_); 
     printf("\tstudent id %d\n", s->student_id_); 
     printf("\tstudent age %d\n\n", s->student_age_); 
     } 
} 

void enq(struct student_record* sr) 
{ 

    if (rear == NULL) 
    { 
     rear = student_record_allocate();//(struct node *)malloc(1*sizeof(struct student_record_node)); 
     rear->record_ = sr; 
     rear->next_ = NULL; 
     front = rear; 
    } 
    else 
    { 
     temp=(struct node *)malloc(1*sizeof(struct student_record_node)); 
     rear->next_ = temp; 
     temp->record_ = sr; 
     temp->next_ = NULL; 

     rear = temp; 
    } 

} 
void parseFile(char* filename, struct student_record_node** head) 
{ 
    struct student_record * sr; 


    char item[21], status[21]; 
    int id,age; 


    FILE *fp; 

    if((fp = fopen(filename, "r+")) == NULL) { 
     printf("No such file\n"); 
     exit(1); 
    } 

    while (true) { 
     int ret = fscanf(fp, "%s %s %d %d", item, status, &id, &age); 
     if(ret == 4) 
      { 
       /**printf("\n%s \t %s %d %d", item, status, id, age);**/ 
        sr = (struct node *)malloc(1*sizeof(struct student_record)); 
        strncpy(sr->first_name_, item, 21); 
        /**sr->first_name_ = item;**/ 
        strncpy(sr->last_name_,status,21); 
        /**sr->last_name_ = status;**/ 
        sr->student_id_=id; 
        sr->student_age_=age; 
        enq(sr); 
      } 
     else if(errno != 0) { 
      perror("scanf:"); 
      break; 
     } else if(ret == EOF) { 
      break; 
     } else { 
      printf("No match.\n"); 
     } 
    } 
    printf("\n"); 
    /*if(feof(fp)) { 
     puts("EOF"); 
    }*/ 
} 

輸入文件是:

Joe Smith 00001 24 
Bob Smith 00002 31 
Samantha Smith 00003 30 
Christina Smith 00004 17 
Steven Smith 00005 20 
Jason Smith 00006 3 
Patrick Smith 00007 50 
Alex Smith 00001 29 
+0

那些人在那裏線是 「前」?如果你可以製作一個更小的例子來展示這個問題,那就太好了。 –

+0

這段代碼在多個地方使用'strncpy'不正確。你應該避免使用這個函數,你應該在fscanf中用'%s'使用長度保護。 –

+0

交換功能沒有正確實施,這個邏輯破壞了列表。 (畫一張圖片來說服你自己) –

回答

0

它(嗯...),因爲你要指定一個兼容的指針類型的。

struct student_record_node* sr; 
sr = (struct node *)malloc(1*sizeof(struct student_record_node)); 

在這裏,我們鑄造malloc返回值來「指向struct節點」,然後將其分配給一個「指向struct student_record_node。」

其實演員是不良作風。轉儲它。的malloc返回值是void*,這與任何其他指針兼容。此外,您還可以使用位置作爲sizeof的說法,而這方面具有優勢。 1*只是混亂。所以你留下了:

struct student_record_node *sr = malloc(sizeof *sr); 

和錯誤將消失。

然後檢查空返回值。即使這是一個玩具,也要儘早進入真正的程序員的習慣。

也不是學習c89語法的最好主意,特別是作爲一個新的程序員。它在非平凡的情況下實際上需要糟糕的風格。爲什麼你認爲gcc需要一個標誌來強制它?我知道這可能無法控制,但我會和老師一起提出。

「面對問題」不是問題。如果你要求特別的幫助,你通常會在這裏得到它。

+0

注意:這是一個錯誤,但也有其他幾個 –

0

你不應該強制轉換malloc的回報。 See this link as to why should not.

因此,在線174

sr = (struct node *)malloc(1*sizeof(struct student_record_node)); 

修改代碼,

sr = malloc(1*sizeof(struct student_record_node)); 

重複此爲所有比排序似乎OK三個lines.Other。

要打印到文件,你可以使用函數fprintf(fp,"....")而不是用printf

+0

'printNode()'函數忽略了它的參數並且總是轉儲整個列表,這並不是真的一個好的設計。應該有一個「打印一個節點」功能,另一個功能是「打印列表中的所有節點」,反過來,該功能會反覆調用一次打印一個節點的功能。我懷疑還有其他問題 - 在這個問題的前一版本中肯定存在。 –

+0

在這裏不能同意:你的建議會使警告消失,但代碼仍會分配錯誤的字節數。它應該是鑄造版本,但是要鑄造到正確的類型;或(我的首選)'sr = malloc(sizeof * sr);' –

0

檢查此行

if (ptr1 == NULL) 
    return; 

它應該在的地方 「PTR」