| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 578 人关注过本帖
标题:链表问题操作。。。速求解
只看楼主 加入收藏
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:5 
想帮你改啊,可是我现在刚把自己的程序改完,累啊,如果明天你的还没结贴,我再帮你改

我的地盘
2011-04-03 21:57
shinan77
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:188
注 册:2010-9-24
收藏
得分:5 
既然你用的是链表结构,为什么还要事先指定长度呢?链表最大的优点就是能够动态地分配内存,建议楼主改进一下程序,另外,CHEN *creat(int n);的函数体编得很有问题,建议你在纸上画一画。

--------将学到的东西为我所用,这才是学习的目的 --------
2011-04-03 22:15
shinan77
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:87
专家分:188
注 册:2010-9-24
收藏
得分:0 
程序代码:
#include<iostream.h>
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#define LEN sizeof(student)
class student
{
public:
    int ban;
    int xue;
    char name[20];
    int cs;
    int cm;
    int ce;
    int av;
    student *next;
    student(int b=0,int x=0,char n[40]="无名氏",int s=0,int m=0,int e=0)
    {
        ban=b;xue=x;strcpy(name,n);cs=s;cm=m;ce=e;av=(cs+cm+ce)/3;
    }
};
    student *head;
        int n;
    int shanchu(int x)
    {
      student *p4,*p5;
      int i=0;
      p4=head;
      if(x==head->xue)
      {
          i=1;
          head=p4->next;
          cout<<"删除成功"<<endl;return 0;
      }
      else
          while(p4->next!=0)
          {
              p5=p4;
              p4=p4->next;
              if(p4->xue==x)
              {
                  n--;
                  i=1;
                  p5->next=p4->next;
                  cout<<"删除成功"<<endl;return 0;
              }
          }
          if(i==0)
              cout<<"没有这个学号"<<endl;return 1;
    }
    int chazhao(int x)
    {
      student *p3=head;
      int i=0;
      while(p3!=0)
      {
          if(x==p3->xue)
          {i=1;
          cout<<"姓名"<<p3->name<<"  班级"<<p3->ban<<"  学号"<<p3->xue<<"  C语言"<<p3->cs<<"  高数"<<p3->cm<<"  英语"<<p3->ce<<"  平均分"<<p3->av<<endl;return 0;break;}
        else p3=p3->next;
      }
      if(i==0)
          cout<<"没有这个学号"<<endl;return 1;
    }

    void paixu(student *x)
    {  
         int temp1,temp2,temp3,temp4,temp5,temp6;
         char temp[20];
   student *p,*q,*p8;
   p=x;
   while(p)      //如果P存在
   {
       q=p->next;    //临近的2个数据进行比较
      while(q)   
      {
   if(p->av<q->av)  //对比
   {
    temp1=p->av;  //先吧P的值放到temp里面
    temp2=p->ban;
    temp3=p->ce;
    temp4=p->cm;
    temp5=p->cs;
    temp6=p->xue;
    strcpy(temp,p->name);
           p->av=q->av; //把Q的值赋值给P
           p->ban=q->ban;
           p->ce=q->ce;
           p->cm=q->cm;
           p->cs=q->cs;
           p->xue=q->xue;
           strcpy(p->name,q->name);
            q->av=temp1;  //把原来temp里面的只放到Q上
            q->ban=temp2;
            q->ce=temp3;
            q->cm=temp4;
            q->cs=temp5;
            q->xue=temp6;
            strcpy(q->name,temp);
   }
          q=q->next;  
      }
       p=p->next;

 
  
   }  p8=x;
   while(p8)
   {
   cout<<"姓名"<<p8->name<<"  班级"<<p8->ban<<"  学号"<<p8->xue<<"  C语言"<<p8->cs<<"  高数"<<p8->cm<<"  英语"<<p8->ce<<"  平均分"<<p8->av<<endl;
      p8=p8->next;
   }
    }

    student *creat()
    {
        student *p1,*p2,*p3;
        n=0;int h=1;

        p1=p2=(student *)malloc(LEN);
   
            cout<<"学号";cin>>p1->xue;
        cout<<"姓名";cin>>p1->name;
        cout<<"班级";cin>>p1->ban;
        cout<<"C语言";cin>>p1->cs;
        cout<<"高数";cin>>p1->cm;
        cout<<"英语";cin>>p1->ce;
        p1->next=0;
        p1->av=(p1->cs+p1->cm+p1->ce)/3;
        head=0;int k=0,t=0;
        while(n<=9)
        {  
            n=n+1;
            if(n==1)head=p1;
            else p2->next=p1;
            p2=p1;p3=head;
            p1=(student *)malloc(LEN);
           
            while(p3)
            {
                t=0;  p3=head;
        cout<<"学号";cin>>t;
        if(t==0) {k=1;break;}
   
               while(p3)
               {
                   if(t==p3->xue)
                   {
                     
                cout<<"学号被占用"<<endl;
                break;
                   }
                  p3=p3->next;
                 
               }
            
              
            }
       
if(k==1) break;
        p3=head;
    p1->xue=t;
        cout<<"姓名";cin>>p1->name;
        cout<<"班级";cin>>p1->ban;
        cout<<"C语言";cin>>p1->cs;
        cout<<"高数";cin>>p1->cm;
        cout<<"英语";cin>>p1->ce;
        p1->next=0;
        p1->av=(p1->cs+p1->cm+p1->ce)/3;
        }
        p2->next=0;
        return (head);
    }
    int rewrite(int x)
    {
        int i=0;
        student *p1=head;
        do
        {
            if(p1->xue==x)
            {
                i=1;
                cout<<"姓名";cin>>p1->name;
        cout<<"班级";cin>>p1->ban;
        cout<<"C语言";cin>>p1->cs;
        cout<<"高数";cin>>p1->cm;
        cout<<"英语";cin>>p1->ce;
        p1->av=(p1->cs+p1->cm+p1->ce)/3;return 1;break;
            }
            else
            p1=p1->next;
        }while(p1!=0);
        if(i==0)
              cout<<"没有这个学号"<<endl;return 0;
    }
    void exit()
    {
        cout<<"感谢使用";
    }
    void charu()
    {    int wei;
               
        student *p9,*p11,*p10=(student *)malloc(LEN);
        p9=p11=head;int shu=0;
        while(p11)
        {
           
            shu++;
            p11=p11->next;
        }
        p11=head;
        int k1=0;int k=0;
        while(k1==0)
        {
        cout<<"插入范围(1—"<<shu<<')'<<endl;cout<<"请输入插入的位置"<<endl;
                cin>>wei;
       
        for(;wei-1>0;wei--)
        {
           
            if(wei==0||wei>shu)
            {cout<<"非法输入"<<endl;k1=1;break;}
            p9=p9->next;
        }
        if(k1==1)
            k1=0;
        else k1=1;
        }
        if(k==0)
        {
        p10->next=p9->next;
        p9->next=p10;int t=0;
    while(p11)
    {   k=0;p11=head;
        cout<<"学号";cin>>t;
        while(p11)
        {
            if(p11->xue==t||p11->xue==0)
            {
                k=2;
                cout<<"学号被占用"<<endl;
                break;
            }
            p11=p11->next;
        }
    }
   
   
        if(k==0)
        {p10->xue=t;
        cout<<"姓名";cin>>p10->name;
        cout<<"班级";cin>>p10->ban;
        cout<<"C语言";cin>>p10->cs;
        cout<<"高数";cin>>p10->cm;
        cout<<"英语";cin>>p10->ce;
        p10->av=(p10->cs+p10->cm+p10->ce)/3;
        }
        }
       
    }
    void chakan()
    {
        student *p8;
        p8=head;
       while(p8)
   {
   cout<<"姓名"<<p8->name<<"  班级"<<p8->ban<<"  学号"<<p8->xue<<"  C语言"<<p8->cs<<"  高数"<<p8->cm<<"  英语"<<p8->ce<<"  平均分"<<p8->av<<endl;
      p8=p8->next;
   }
    }
    void baocun()
    {
        FILE *fp; student *p=head;
        if((fp=fopen("g:\\学生信息表.txt","w"))==0) cout<<"失败";
        while(p)
        {
            fprintf(fp,"姓名%s,班级%d,学号%d,C语言%d,高数%d,英语%d,平均分%d\n",p->name,p->ban,p->xue,p->cs,p->cm,p->ce,p->av);
            p=p->next;
        }
        fclose(fp);
        cout<<"文件已保存在G:\\学生信息表\n";
    }
    student *duqu()
    {
        FILE *fp;
        if((fp=fopen("g:\\学生信息表.txt","r+"))==0) cout<<"失败";
        student *p1,*p2;
        n=0;int h=1;

        p1=p2=(student *)malloc(LEN);
   
            fscanf(fp,"姓名%s,班级%d,学号%d,C语言%d,高数%d,英语%d,平均分%d\n",p1->name,p1->ban,p1->xue,p1->cs,p1->cm,p1->ce,p1->av);
        p1->next=0;
       
        head=0;
        while(n<=9)
        {  
            n=n+1;
            if(n==1)head=p1;
            else p2->next=p1;
            p2=p1;
            p1=(student *)malloc(LEN);    

        if(fscanf(fp,"姓名%s,班级%d,学号%d,C语言%d,高数%d,英语%d,平均分%d\n",p1->name,p1->ban,p1->xue,p1->cs,p1->cm,p1->ce,p1->av)==EOF)
            break;
        }
        p2->next=0;
        fclose(fp);
        return (head);
    }

    void main()
    {
     int cai=0;
     int hao=0;
     int z=0;
   cout<<"*********学生成绩管理系统**********"<<endl;
   cout<<"                                  制作者    石楠"<<endl<<endl;
       while(1)
      {
        cout<<"1录入,2删除,3查找,4排序,5修改,6插入,7查看,8保存,9读取,10退出";cin>>cai;
         if(cai==1)
         {cout<<"学号输入0可终止录入"<<endl;creat();
        
         z=1;
         }
         if(cai==10)
         {exit();break;}             if(cai==9) {cout<<"此功能完善中\n";}
         if(cai!=1&&z==0)

             cout<<"请先进行录入"<<endl;
        if(z==1)
         {
         if(cai==2)
         {
             int k=1;
             while(k==1)
             {
             cout<<"请输入要删除的学号";
           int num1;
           cin>>num1;
           k=shanchu(num1);
             }

         }
            if(cai==3)
            {
                int k=1;
                while(k==1)
                {
                cout<<"请输入要查询的学号";
                int num;
               cin>>num;
         
            k=chazhao(num);
                }
            }
            if(cai==4)
                paixu(head);
            if(cai==5)
            {
                int xiu;int k=0;
                while(k==0)
                {
                cout<<"请输入要修改的学号"<<endl;
                cin>>xiu;
                k=rewrite(xiu);
                }
            }
           
            if(cai==6)
            {
               
                charu();
               
            }
            if(cai==7)
            chakan();
            if(cai==8)
            {
                baocun();
            }
           
         }
    
      }
    }
这是我曾经编过的一个用链表实现的学生成绩管理系统,楼主可以参考一下其中的student *creat();这个函数

--------将学到的东西为我所用,这才是学习的目的 --------
2011-04-03 22:20
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:0 
不是吧,我这都编译通过了,怎么不能编译?

我用的是VC6.0
2011-04-03 22:21
bccn250
Rank: 5Rank: 5
等 级:职业侠客
帖 子:154
专家分:379
注 册:2010-5-25
收藏
得分:0 
我前面发的那段代码,你要看看 scanf 函数的那个注释

我自己是改成 scanf("%d%s%s",&p->age,p->name,p->sex);

然后输入资料的时候,是用空格隔开的,比如   18空格 michael空格 man回车

2011-04-03 22:27
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
按你的想法,帮你改好了

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

struct student
{
    char age[5];
    char name[20];
    char sex[10];
    struct student *next;
};

void creat(struct student **head,int n)
{
    struct student *q,*p;
    int i;
    if(i<=0) return;
    for(i=1;i<=n;i++)
    {
        q=(struct student *)malloc(sizeof(struct student));
        fflush(stdin);
        printf("请输入学生的资料\n");
        printf("学生姓名:");
        gets(q->name);
        printf("学生年龄:");
        gets(q->age);
        printf("学生性别:");
        gets(q->sex);
        if(*head == NULL)
        {
            q->next = NULL;
            *head = q;
        }
        p = *head;
        while(p->next!=NULL)
        {
             p = p->next;
        }
        p->next = q;
        q->next = NULL;
    }
}

void insert(struct student **head,struct student *j)
{
    struct student *q,*p;
    if(*head == NULL)
    {
        j->next=NULL;
        *head = j;
        printf("1");
        return;
    }
    q = *head;
    p = NULL;
    while(q)
    {
         if(strcmp(q->age,j->age)<0)
         {
                p = q;             //主要思想是把p作为q的上个结点
                q = q->next;
         }
         else
         {
                if(p == NULL)     //作为新头结点
                {
                     j->next = q;
                     *head = j;
                     return;
                }
                p->next = j;     //插入中间
                j->next = q;
                return;
         }
    }
    p->next = j;          //放在末尾
    j->next = NULL;
}

void print(struct student *head)
{
    int i=1;
    while(head!=NULL)
    {
        printf("学生%d的资料如下:\n",i);
        printf("姓名:%s\n",head->name);
        printf("年龄:%s\n",head->age);
        printf("性别:%s\n",head->sex);
        head=head->next;
        i++;
    }
}

int main()
{
    struct student *head,*o;
    head = NULL;
    int n;//,f;
    printf("请输入结点个数:\n");
    scanf("%d",&n);
    creat(&head,n);
    print(head);
    system("pause");
    while(1)
    {
         fflush(stdin);
         printf("请输入新学生的资料\n");
         o=(struct student *)malloc(sizeof(struct student));
         printf("学生姓名:");
         gets(o->name);
         if(o->name[0] == '0') break;  //当名字第一个字符为0时,退出输入
         printf("学生年龄:");
         gets(o->age);
         printf("学生性别:");
         gets(o->sex);
         insert(&head,o);
    }
    print(head);
    system("pause");
    return 0;
}

我的地盘
2011-04-04 12:13
卡其
Rank: 2
等 级:论坛游民
帖 子:96
专家分:36
注 册:2010-8-30
收藏
得分:0 
谢谢楼上的兄弟们咯。。大家辛苦啦。
2011-04-04 14:36
快速回复:链表问题操作。。。速求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024548 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved