Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的链表插入排序_C_Sorting_Linked List - Fatal编程技术网

c语言中的链表插入排序

c语言中的链表插入排序,c,sorting,linked-list,C,Sorting,Linked List,程序应该对节点执行插入升序排序,首先它应该检查名称,如果名称相等,它应该对ID进行排序,我不知道排序不正确的问题是什么 # include <stdio.h> # include <string.h> # include <stdlib.h> typedef struct nd{ int id; char name[20]; float gpa; struct nd *next; }node; typedef node *list; //-------

程序应该对节点执行插入升序排序,首先它应该检查名称,如果名称相等,它应该对ID进行排序,我不知道排序不正确的问题是什么

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

typedef struct nd{
int id;
char name[20];
float gpa;
struct nd *next;
}node;


typedef node *list;

//---------------------------------------------------------------

int insertlist(list *head,char *buffer)
{
list p,q,n;
int m,num,k,sc;
p=(list)malloc(sizeof(node));
num=sscanf(buffer,"%d %s %f",&(p->id),(p->name),(&p->gpa));
if(num!=3)
 {
  printf("info not complete\n");
  free(p);
  return 1;
 }
else
{

   if(!*head)
   {
    *head=p;
    p->next = NULL;
   }
//******** sorting tthe names and ids for equal names
   else if(sc=strcmp((*head)->name,p->name)> 0 || ((sc == 0) && ((*head)->id > p->id)))
      {//head is modified
        p->next=*head;
        *head=p;
      }

   else{
        n=*head;
        q=n->next;
        while(q && ((sc=strcmp(q->name,p->name)<0) || ((sc == 0) && (q->id < p->id))))
          {
           n=q;
           q=q->next;
          }
       n->next=p;
       p->next=q;
       }
}

return 0;
}

//------------------------------------------------------

int main()
{
int id,r;
list head,p;
FILE *fp;
char c,buffer[100],filename[10];
if ((fp=fopen("student.txt","r"))==NULL)
{
  printf("error opening %s",filename);
  exit(1);
}
else
 {
head=NULL;

while(fgets(buffer,100,fp)!=NULL)
   {
    buffer[strlen(buffer)-1]=='\0';
    r=insertlist(&head,buffer);
   }
fclose(fp);
 }

for(p=head;p!=NULL;p=p->next)
  printf("%d  %s  %f\n\n",p->id,p->name,p->gpa);
}

head是一个指针,所以为了在函数中更改它,您需要向它传递一个指针。指向指针的指针

声明如下:

int insertlist(list **head,char *buffer)
r=insertlist(&(&head),buffer);
可以这样称呼:

int insertlist(list **head,char *buffer)
r=insertlist(&(&head),buffer);
然后在函数中,在引用它的任何地方更改以取消引用指针。

首先,修复此问题:

buffer[strlen(buffer)-1]=='\0';
这是一个平等的比较;不是任务。我相信你是在试图在缓冲区的末尾抛出新行。如果是这种情况,您可能需要确保它有一个换行符作为开始(例如,输入文件的最后一行可能不会以一行结尾。无论如何,这仍然是中断的,需要修复

接下来,您的排序循环有问题。我在下面列出了一个,希望它更容易阅读,因此也更容易理解,逻辑缺陷已经消除(还有很多其他课外活动):

结果:

1  Brook  3.500000

5  Brook  2.700000

2  James  3.510000

4  James  3.870000

3  Katie  3.520000
我强烈建议您在试图修复这些问题以及希望了解代码如何工作时,在调试器中单步执行代码

最后,不要雪上加霜,你永远不会释放你的列表。也就是说,它在程序退出时泄漏内存,这是仅次于在执行过程中泄漏内存的“坏”级别。遍历该列表并释放内存。这是一个好习惯


编辑释放链接列表的操作请求:

现在,在<代码>主()/<代码> <代码> >返回< /C> >语句就足够了。在某个时候,您应该考虑编写一个函数来为您这样做:

while (head)
{
    list p=head;
    head=head->next;
    free(p);
}

您的排序问题是其中之一

的优先级高于
=
,这意味着将首先对其求值,然后进行赋值

因此,字符串在以下两个位置进行比较:

else if(sc=strcmp((*head)->name,p->name)> 0 || ((sc == 0) && ((*head)->id > p->id)))
...
while(q && ((sc=strcmp(q->name,p->name)<0) || ((sc == 0) && (q->id < p->id))))

你会看到它在工作。这个故事的寓意是:不要试图吝啬你的括号或括号,它不会花费你任何东西来放入更多的括号,它使代码更清晰,并且它可以为你省去像这样的调试麻烦。

不要害怕使用更多描述性变量名。编译器不会抱怨,但任何阅读你的代码的人都可能会抱怨。任何有可能您可以从
student.txt
文件?thx.+1中为我们保存一些键入内容并粘贴一个示例(比如10行),以获得更干净的代码建议。您没有确定最初的问题是什么,但是更干净的代码(像这样)无论如何都会修复它。@WhozCraig你能建议我在代码中释放指针的位置吗?@maziarparsaeian当然可以。@WhozCraig你的意思是在我的主函数中,在打印节点后,我使用提到的函数释放列表?@WhozCraig如果我保留节点并为一些其他问题再次操作它们会怎么样?+1 Lol。用于查找问题。我找到了,但把它放在了我的答案里。我太“到底是什么…”思维定格并将代码简化为一个希望更简单的算法。顺便说一句,眼光很好。@Mike我想我可能用了很多parens,但不是在正确的位置,而不是Xcorrection@maziarparsaeian也不正确。你的头指针已经通过地址传递了。(那个
&(&
让我头晕目眩)。
else if(sc=strcmp((*head)->name,p->name)> 0 || ((sc == 0) && ((*head)->id > p->id)))
...
while(q && ((sc=strcmp(q->name,p->name)<0) || ((sc == 0) && (q->id < p->id))))
else if((sc=strcmp((*head)->name,p->name))> 0 || ((sc == 0) && ((*head)->id > p->id)))
...
while(q && (((sc=strcmp(q->name,p->name))<0) || ((sc == 0) && (q->id < p->id))))