零的执行人 发表于 2020-7-3 12:49:00

这个排序为什么编译通过运行不出来C语言

只看一下sort函数就行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _STU
{
      char num;
      char name;
      ints1,s2,s3;
      int sall;//S1+S2+S3
      struct _STU* pNext;
} STUNODE;

//声明链表的头和尾
STUNODE* g_pHead = NULL;//O
STUNODE* g_pEnd = NULL;

//排序
void sort();
//清空链表,防止内存泄漏
void freenode()
{
      STUNODE* pTemp = g_pHead;
      while (g_pHead != NULL)
      {
                //记录节点
                pTemp = g_pHead;

                //向后移动了一个
                g_pHead = g_pHead->pNext;

                //删除节点
                free(pTemp);
      }
}
//菜单
void Printmnue()
{

printf("1.添加学生数据\n");

printf("3.排序\n");

printf("6.显示学生信息\n");

printf("7.退出\n");
}
//添加学生
void add(char *num,char *name,int s1,int s2,int s3)
{      
      //创建一个节点
      STUNODE* pTemp =(STUNODE*)malloc(sizeof (STUNODE));

      //第一步,检验参数的合法性
      if (NULL == num || NULL == name || s1 < 0||s2<0||s3<0)
      {
                printf ("学生信息输入错误!\n");
                return ;
      }
      //节点成员符初始值
      strcpy(pTemp->num, num);
      strcpy(pTemp->name, name);
      pTemp->s1 = s1;
      pTemp->s2 = s2;
      pTemp->s3 = s3;
      pTemp->pNext = NULL;

      //接在链表上
      if (NULL == g_pHead || NULL == g_pEnd)
      {
                g_pHead = pTemp;
                //g_pEnd = pTemp;
      }
      else
      {
                g_pEnd->pNext = pTemp;//链接
                //g_pEnd = pTemp;         //向后移动
      }
      g_pEnd = pTemp;

}

//显示所有学生
void show()
{      //声明指针
      STUNODE* pTemp = g_pHead;
      while (pTemp != NULL)//遍历链表
      {
                printf ("学号:%s\t, 姓名:%s\t, 语文:%d\t, 数学:%d\t, 英语:%d\t\n", pTemp->num, pTemp->name, pTemp->s1, pTemp->s2, pTemp->s3);
                //向下走一步
                pTemp = pTemp->pNext;
      }
}

int main()
{      
      int choice=-1; //初始化
      char num = {'\0'};
      char name = {'\0'};
      ints1= -1;
      ints2= -1;
      ints3= -1;
      int sum;//=s1+s2+s3;
      int flag= 1;
      STUNODE* pTemp = NULL;
      Printmnue();

      
      while (flag)
      {      
      
                   printf("请输入你的选择(1-7)\n");
                  scanf("%d", &choice);
          switch (choice)
          {
   case 1:
         //尾添加
                printf ("输入学号:");
                scanf ("%s", num);
                printf ("输入姓名:");
                scanf ("%s", name);
                printf ("输入语文成绩:");
                scanf ("%d", &s1);
                printf ("输入数学成绩:");
                scanf ("%d", &s2);
                printf ("输入英语成绩:");
                scanf ("%d", &s3);
                add(num, name, s1,s2,s3);      
            break;

   case 3:
               //排序
                      sort();

            break;

   case 6:
               //显示所有学生
               show();
            break;
   case 7:
               //退出
               flag=0;
            break;
      
      }
   
}
         
      //释放链表
      freenode();
      system("pause");
      return 0;
}
//排序
voidsort()
{
        STUNODE* pTemp = g_pHead;
        char num = {0};
        char name = {'\0'};
        int s1,s2,s3;
        int sum;
        STUNODE *p,*q;
        for(p=g_pHead;p!=NULL;p=p->pNext)
        {
                for(q=p;q!=NULL;q=q->pNext)
                {
                        if((q->s1 +q->s2 +q->s3 )<(q->pNext->s1 +q->pNext->s2 +q->pNext->s3 ))
                        {
                                s1=q->s1 ,q->s1=q->pNext->s1,q->pNext->s1=s1;
                                s2=q->s2 ,q->s2=q->pNext->s2,q->pNext->s2=s2;
                                s3=q->s3 ,q->s3=q->pNext->s3,q->pNext->s3=s3;
                                strcpy(num, q->num );
                                strcpy(q->num,q->pNext->num );
                                strcpy(q->pNext->num,num);
                                strcpy(name, q->name );
                                strcpy(q->name,q->pNext->name );
                                strcpy(q->pNext->name,name);       
                        }
                }
        }
        //STUNODE* pTemp = g_pHead;
        while (pTemp != NULL)//遍历链表
        {
                printf ("学号:%s\t, 姓名:%s\t, 英语:%d\t, 计算机:%d\t, 数学:%d\t\n", pTemp->num, pTemp->name, pTemp->s1, pTemp->s2, pTemp->s3);
                //向下走一步
                pTemp = pTemp->pNext;
        }
       
       
}

chxchxkkk 发表于 2020-7-4 10:34:54

s1=q->s1 ,q->s1=q->pNext->s1,q->pNext->s1=s1; 这种写法很奇怪,语句间不是应该用 ; 隔开吗,或者你这个是逗号表达式?
页: [1]
查看完整版本: 这个排序为什么编译通过运行不出来C语言