[数据结构][C++]使用线性表实现一个通讯录

使用线性表实现一个通讯录,通讯录内容包含学号、姓名、电话三项数据。完成通讯录数据的建立,纪录插入和删除功能。

#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#include <string.h>
//--------------------------------------------------------------------
struct ElemType              // 数据元素的类型
{ 
        int numb;
        char name[20];
        int tel;
};
 
const int MAXSIZE=100;     // 数组的容量
 
class Sqlist
{
private:
        ElemType  elem[MAXSIZE];
        int length;
    public:
                Sqlist( void);
                ~Sqlist(){ };
                void  SetData();
                void  Insert( int i, ElemType e);
                ElemType Delet(int i);
                void PrintOut();
};
//-------------------------------------------------------------
Sqlist::Sqlist( ) { length=0;}
void  Sqlist::SetData( )     //初步建立一个通讯录 
{
        cout<<"\n 输入人数length="<<endl;
        cin>>length;
        for(int i=0;i<length;i++)
        { 
                cout<<"\n 输入学号:";  
                cin>>elem[i].numb;
                cout<<"\n 输入姓名:"; 
                cin>> elem[i].name;
                cout<<"\n 输入电话号:="; 
                cin>>elem[i].tel;
        }
}
void  Sqlist::Insert( int i, ElemType e) //请完成此函数
{
        if(length==MAXSIZE)
                cout<<"FLOW!"<<endl;
        else
                if(i<1||i>length+1)
                        cout<<"Insert ERROR!"<<endl;
                else
                        for(int j=length;j>=i;j--)
                                elem[j]=elem[j-1];
                        elem[i-1]=e;
                        length++;
                        cout<<"Insert success!"<<endl;
 
}
ElemType Sqlist::Delet(int i)
{
  ElemType x;
        if(i<1||i>length)
                cout<<"RANGE ERROR!"<<endl;
        else
        {
                x=elem[i-1];
                for(int j=i;j<length;j++)
                        elem[j-1]=elem[j];
                length--;
                cout<<"success"<<endl;
        }
   return x;
}
void Sqlist::PrintOut()  //输出
{ 
        cout<<"\n 通讯录总人数:"<<length;
        cout<<"\n PrintOut Data:\n";
        cout<<setw(16)<<"学号"<<setw(20)<<"姓名"<<setw(20)<<"电话号"<<endl;
        for(int k=0; k<length;k++)      
        { 
                cout<<setw(16)<<elem[k].numb<<setw(20)<<elem[k].name<<setw(20)<<elem[k].tel<<endl;
        }
}
//--------------------------------------------------
int main( )
{ int i,k;  ElemType e,x;
  Sqlist  as;
  cout<<"\n               通讯录演示";
  do{
      cout<<"\n\n";
      cout<<"\n\n    1. 初步建立一个通讯录(线性表) ";
      cout<<"\n\n    2. 插入一个数据元素 ";
      cout<<"\n\n    3. 删除一个元素,返回其值";
      cout<<"\n\n    4. 结束程序";
      cout<<"\n******************************** ";
      cout<<"\n    请输入你的选择(1,2,3,4)";  cin>>k;
          switch(k)
          { 
          case 1:
                  {  as.SetData(); as.PrintOut();  }break;
          case 2:{ cout<<"\n 插入的位置, i=?"; cin>>i;
                   cout<<"\n 插入的数据 编号=?"; cin>>e.numb;
                   cout<<"\n 插入的数据 姓名=?"; cin>>e.name;
                   cout<<"\n 插入的数据 电话号=?"; cin>>e.tel;
                   as.Insert(i,e);  as.PrintOut();
                 }break;
          case 3:{ cout<<"\n 删除第几个元i=?";  cin>>i;
                  x=as.Delet(i);
                  cout<<"\n  被删除的元素数值= "<<setw(10)<<x.numb<<
                  setw(10)<<x.name<<setw(10)<<x.tel;
                  as.PrintOut();
                 }break;
          default:break;
          } //switch
  }while(k>=1&&k<4);
  cout<<"\n          再见!";  cout<<"\n     按任意键,返回。";
  _getch(); return 0;
}

[纯C实现贪吃蛇游戏]vc++ 6.0实现

#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<stdlib.h>
 
#define U 1
#define D 2
#define L 3 
#define R 4 //蛇的状态,U:上 ;D:下;L:左 R:右
 
typedef struct SNAKE //蛇身的一个节点
{
 int x;
 int y;
 struct SNAKE *next;
}snake;
 
//全局变量//
int score=0,add=10;//总得分与每次吃食物得分。
int status,sleeptime=200;//每次运行的时间间隔
snake *head, *food;//蛇头指针,食物指针
snake *q;//遍历蛇的时候用到的指针
int endgamestatus=0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。
 
//声明全部函数//
void Pos();
void creatMap();
void initsnake();
int biteself();
void createfood();
void cantcrosswall();
void snakemove();
void pause();
void gamecircle();
void welcometogame();
void endgame();
void gamestart();
 
void Pos(int x,int y)//设置光标位置
{
 COORD pos;
 HANDLE hOutput;
 pos.X=x;
 pos.Y=y;
 hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleCursorPosition(hOutput,pos);
}
 
void creatMap()//创建地图
{
 int i;
 for(i=0;i<58;i+=2)//打印上下边框
 {
 Pos(i,0);
 printf("■");
 Pos(i,26);
 printf("■");
 }
 for(i=1;i<26;i++)//打印左右边框
 {
 Pos(0,i);
 printf("■"); 
 Pos(56,i);
 printf("■"); 
 }
}
 
void initsnake()//初始化蛇身
{
 snake *tail;
 int i;
 tail=(snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//
 tail->x=24;
 tail->y=5;
 tail->next=NULL;
 for(i=1;i<=4;i++)
 {
 head=(snake*)malloc(sizeof(snake));
 head->next=tail;
 head->x=24+2*i;
 head->y=5;
 tail=head;
 }
 while(tail!=NULL)//从头到为,输出蛇身
 {
 Pos(tail->x,tail->y);
 printf("■");
 tail=tail->next;
 }
}
 
int biteself()//判断是否咬到了自己
{
 snake *self;
 self=head->next;
 while(self!=NULL)
 {
 if(self->x==head->x && self->y==head->y)
 {
 return 1;
 }
 self=self->next;
 }
 return 0;
}
 
void createfood()//随机出现食物
{
 snake *food_1;
 srand((unsigned)time(NULL));
 food_1=(snake*)malloc(sizeof(snake));
 while((food_1->x%2)!=0) //保证其为偶数,使得食物能与蛇头对其
 {
 food_1->x=rand()%52+2;
 }
 food_1->y=rand()%24+1;
 q=head;
 while(q->next==NULL)
 {
 if(q->x==food_1->x && q->y==food_1->y) //判断蛇身是否与食物重合
 {
 free(food_1);
 createfood();
 }
 q=q->next;
 }
 Pos(food_1->x,food_1->y);
 food=food_1;
 printf("■");
}
 
void cantcrosswall()//不能穿墙
{ 
 if(head->x==0 || head->x==56 ||head->y==0 || head->y==26)
 {
 endgamestatus=1;
 endgame();
 }
}
 
void snakemove()//蛇前进,上U,下D,左L,右R
{
 snake * nexthead;
 cantcrosswall();
 
 nexthead=(snake*)malloc(sizeof(snake));
 if(status==U)
 {
 nexthead->x=head->x;
 nexthead->y=head->y-1;
 if(nexthead->x==food->x && nexthead->y==food->y)//如果下一个有食物//
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next;
 }
 score=score+add;
 createfood();
 }
 else //如果没有食物//
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q->next->next!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next; 
 }
 Pos(q->next->x,q->next->y);
 printf(" ");
 free(q->next);
 q->next=NULL;
 }
 }
 if(status==D)
 {
 nexthead->x=head->x;
 nexthead->y=head->y+1;
 if(nexthead->x==food->x && nexthead->y==food->y) //有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next;
 }
 score=score+add;
 createfood();
 }
 else //没有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q->next->next!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next; 
 }
 Pos(q->next->x,q->next->y);
 printf(" ");
 free(q->next);
 q->next=NULL;
 }
 }
 if(status==L)
 {
 nexthead->x=head->x-2;
 nexthead->y=head->y;
 if(nexthead->x==food->x && nexthead->y==food->y)//有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next;
 }
 score=score+add;
 createfood();
 }
 else //没有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q->next->next!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next; 
 }
 Pos(q->next->x,q->next->y);
 printf(" ");
 free(q->next);
 q->next=NULL;
 }
 }
 if(status==R)
 {
 nexthead->x=head->x+2;
 nexthead->y=head->y;
 if(nexthead->x==food->x && nexthead->y==food->y)//有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next;
 }
 score=score+add;
 createfood();
 }
 else //没有食物
 {
 nexthead->next=head;
 head=nexthead;
 q=head;
 while(q->next->next!=NULL)
 {
 Pos(q->x,q->y);
 printf("■");
 q=q->next; 
 }
 Pos(q->next->x,q->next->y);
 printf(" ");
 free(q->next);
 q->next=NULL;
 }
 }
 if(biteself()==1) //判断是否会咬到自己
 {
 endgamestatus=2;
 endgame();
 }
}
 
void pause()//暂停
{
 while(1)
 {
 Sleep(300);
 if(GetAsyncKeyState(VK_SPACE))
 {
 break;
 }
 
 }
}
 
void gamecircle()//控制游戏 
{
 
 Pos(64,15);
 printf("不能穿墙,不能咬到自己\n");
 Pos(64,16);
 printf("用↑.↓.←.→分别控制蛇的移动.");
 Pos(64,17);
 printf("F1 为加速,F2 为减速\n");
 Pos(64,18);
 printf("ESC :退出游戏.space:暂停游戏.");
 Pos(64,20);
 printf("c语言");
 status=R;
 while(1)
 {
 Pos(64,10);
 printf("得分:%d ",score);
 Pos(64,11);
 printf("每个食物得分:%d分",add);
 if(GetAsyncKeyState(VK_UP) && status!=D)
 {
 status=U;
 }
 else if(GetAsyncKeyState(VK_DOWN) && status!=U)
 {
 status=D;
 }
 else if(GetAsyncKeyState(VK_LEFT)&& status!=R)
 {
 status=L;
 }
 else if(GetAsyncKeyState(VK_RIGHT)&& status!=L)
 {
 status=R;
 }
 else if(GetAsyncKeyState(VK_SPACE))
 {
 pause();
 }
 else if(GetAsyncKeyState(VK_ESCAPE))
 {
 endgamestatus=3;
 break;
 }
 else if(GetAsyncKeyState(VK_F1))
 {
 if(sleeptime>=50)
 {
 sleeptime=sleeptime-30;
 add=add+2;
 if(sleeptime==320)
 {
 add=2;//防止减到1之后再加回来有错
 }
 }
 }
 else if(GetAsyncKeyState(VK_F2))
 {
 if(sleeptime<350)
 {
 sleeptime=sleeptime+30;
 add=add-2;
 if(sleeptime==350)
 {
 add=1; //保证最低分为1
 }
 }
 }
 Sleep(sleeptime);
 snakemove();
 }
}
 
void welcometogame()//开始界面
{
 Pos(40,12);
 
 system("title c语言");
 printf("欢迎来到贪食蛇游戏!");
 Pos(40,25);
 system("pause");
 system("cls");
 Pos(25,12);
 printf("用↑.↓.←.→分别控制蛇的移动, F1 为加速,2 为减速\n");
 Pos(25,13);
 printf("加速将能得到更高的分数。\n");
 system("pause");
 system("cls");
}
 
void endgame()//结束游戏
{
 
 system("cls");
 Pos(24,12);
 if(endgamestatus==1)
 {
 printf("对不起,您撞到墙了。游戏结束.");
 }
 else if(endgamestatus==2)
 {
 printf("对不起,您咬到自己了。游戏结束.");
 }
 else if(endgamestatus==3)
 {
 printf("您的已经结束了游戏。");
 }
 Pos(24,13);
 printf("您的得分是%d\n",score);
 exit(0);
}
 
void gamestart()//游戏初始化
{
 system("mode con cols=100 lines=30");
 welcometogame();
 creatMap();
 initsnake();
 createfood();
}
 
int main()
{
 gamestart();
 gamecircle();
 endgame();
 return 0;
}

[学生成绩管理系统]c实现

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
/*********************************宏定义*****************************************/
#define N 100                                //结构体中数组的大小
/*********************************函数声明***************************************/
void save_file();        
void Delay();                
/*********************************自定义数据类型*********************************/
typedef struct stu
{
        char num[N];                        //学号
        char name[N];                        //姓名
        char chinese[N];                //语文
        char math[N];                        //数学

        struct stu* pnext;

}STU;
/*********************************全局变量定义*********************************/
STU* pStu = NULL;                        //表头
STU* pCurrent = NULL;                //当前学生(已经存在)
STU* pNew=NULL;                                //当前学生(待输入)
char KEY[7];                                //服务密码
/*********************************子函数定义***********************************/
//登陆验证        
void InCheck()                                                        
{        
        int InputLimit= 0;
        char keynumber[7]="0";
        int i = 0;

        srand((unsigned)time(NULL));                //生成随机验证码
        for(i=0;i<6;i++)
        {
                KEY[i] = rand() % 10  + 48; 
        }
        KEY[6] = '\0';

        system("cls");
        system("color 3e");

        printf("\n\n\t┌================================================┑\n");
        printf("\n\n");
        printf("\t\t\t欢迎使用学生信息管理系统\n");
        printf("\t\t\t\t\n");
        printf("\t\t\t\t\n");
        printf("\t\t\t\t\n");
        printf("\t\t\t请输入验证码登陆此系统\n");
        printf("\t\t\t<验证码是%s>\n",KEY);
        printf("\t\t\t \n");
        printf("\t\t\t如果3次输入均不正确,将退出系统\n");

        printf("\n\n\t┕================================================┚\n");
        
        
        scanf("%s",keynumber);
        while(strcmp(keynumber,KEY)!=0)
        {        InputLimit++;
                if(InputLimit==3)
                {        printf("\t您输入错误的次数已经到达%d次,您将退出系统",InputLimit);
                        Delay();
                        exit(0);
                }
                printf("\n\t\t您的输入有误!请重新输入\n");
                scanf("%s",keynumber);
        }

        system("cls");
        
}
//检查信息合法性:输入的都是数字字符吗?
char InformationCheck(const char *str)                        
{
        int L = 0;
        int i = 0;
        int PointCount=0;
        int NumCount = 0;


        L = strlen(str);
        for(i=0;i<L;i++)
        {        if(str[i]=='.')
                        PointCount++;
                if((str[i]<'0'||str[i]>'9')&&str[i]!='.')
                {        printf("\t您输入不合法,请重新输入\n");
                        return 1;
                }

        }
        if(PointCount>1)
        {        printf("\t您输入不合法,请重新输入\n");
                return 1;
        }
        else
        {
                return 0;
        }
}
//输入的信息容错后期处理[在InformationCheck,确保没有重大错误之后]
void InformationDebug(char *str)        
{
        int L = 0;
        char PointFlag=0;
        int IntCount = 0;
        int FloatCount = 0;                        //小数部分
        int i = 0;        
        int PositionOfPoint = 0;        //小数点所在的下标
        int ZeroPre = 0;                        //无用的0的个数
        char NotZeroStartFlag=0;        //字符串中开始出现了第一个1-9的数字字符

        L= strlen(str);

        for(i=0;i<L;i++)
        {        if(str[i]>='1'&&str[i]<='9')
                        NotZeroStartFlag=1;

                if(str[i]=='.')
                {        
                        PointFlag = 1;
                        PositionOfPoint = i;
                }
                else if(!PointFlag)
                        IntCount++;
                else
                        FloatCount++;

                if((PointFlag==0)&&(NotZeroStartFlag==0)&&(str[i]=='0')&&(str[i+1]!='.'))        //多余的'0'
                        ZeroPre++;
        }

        if(IntCount==0)                                                                //没有整数部分?
        {
                for(i=L;i>0;i--)
                {
                        str[i]=str[i-1];
                }
                str[0] = '0';
                str[L+1] = '\0';
                PositionOfPoint++;
        }
        if(FloatCount==0&&PointFlag == 1)                        //有小数点却没有小数部分?
        {
                str[PositionOfPoint+1] = '0';
                str[PositionOfPoint+2] = '\0';
        }
        if(ZeroPre>0)
        {
                strcpy(str,str+ZeroPre);
        }
        if(!NotZeroStartFlag)                                                //字符串中从来没有出现过1 -9 字符
        {
                strcpy(str,"0");
        }
}
//检查信息合法性:有没有输入的学号已经存在?
char NumCheck(const char *str)                        
{
        STU * View = NULL;
        int L = 0;
        int i = 0;

        View = pStu->pnext;


        while(View!=NULL)
        {
                if(strcmp(str,View->num)==0)
                {        printf("\t您输入的学号已经存在,请重新输入\n");
                        return 1;
                }
                View=View->pnext;
        }
                                                                                //输入的学号是在0 -9 之内的字符吗
        L = strlen(str);
        for(i=0;i<L;i++)
        {        
                if(str[i]<'0'||str[i]>'9')
                {        printf("\t您输入的字符应在'0'-'9'之间输入,请重新输入\n");
                        return 1;
                }
        }

        return 0;


}
//信息数字检查,,只检查字符串里面是不是只有 '0' - '9' 字符
void NumberCheck(char *str,char *Display)
{
        while(NumCheck(str))
        {
                printf("\t%s:",Display);
                scanf("%s",str);

        }
}
//信息过安检,不仅仅检查字符串里面是不是有除了'0' - '9'和'.'以外的字符,还进行消除冗余的'0'的操作
void SecureCheck(char *str,char *DisPlay)
{
                while(InformationCheck(str))
        {
                
                printf("\t%s:",DisPlay);
                scanf("%s",str);
        }
        InformationDebug(str);
}
//增加学生信息
void AddInformation()                                                                
{        
        int placed=0;
        STU* vIew = NULL;

        system("cls");

        placed=0;
        pNew = (STU *)malloc(sizeof(STU));                        
        pNew->pnext = NULL;
        printf("\t请输入要增加的学生信息:\n");

        printf("\t学号:");
        scanf("%s",pNew->num);
        //信息检查
        NumberCheck(pNew->num,"学号");


        printf("\t姓名:");
        scanf("%s",pNew->name);
        
        
        printf("\t语文:");
        scanf("%s",pNew->chinese);
        //信息检查
        SecureCheck(pNew->chinese,"语文");

        printf("\t数学:");
        scanf("%s",pNew->math);
        //信息检查
        SecureCheck(pNew->math,"数学");
        //信息检查
        vIew = (STU *)malloc(sizeof(STU));
        
        if(pStu->pnext==NULL)
                pStu->pnext=pNew;
        else                                                                //查找最佳位置进行升序插入节点, 维护学号升序顺序的插入
        {        
                vIew->pnext=pStu;
                while(vIew->pnext->pnext!=NULL)
                {
                        if(strcmp(vIew->pnext->num , pNew->num)<=0 && strcmp(vIew->pnext->pnext->num ,pNew->num)>=0)
                        {        
                        
                                pNew->pnext = vIew->pnext->pnext;
                                vIew->pnext->pnext = pNew;
                                placed=1;                                //表示已经放置
                                break;
                                
                        }
                        vIew->pnext = vIew->pnext->pnext;
                }
                if(placed==0)
                        vIew->pnext->pnext = pNew;        //没有找到合适的节点,把pNew挂在链表最后面
                
        }
        
        free(vIew);
        vIew=NULL;
        
}
//显示信息
void ShowInformation()                                        
{
        STU* vIew = NULL;

        system("cls");
        printf("\n\t┍====================显示信息====================┑\n");
        
        
        vIew = (STU *)malloc(sizeof(STU));

        vIew->pnext=pStu->pnext;
        if(vIew->pnext==NULL)
        {
                printf("\n\t\t当前档案内没有学生信息");
        }
        else
        {
                while(vIew->pnext!=NULL)
                {
                printf("\t学号:%s\n",vIew->pnext->num);
                printf("\t姓名:%s\n",vIew->pnext->name);
                printf("\t语文:%s\n",vIew->pnext->chinese);
                printf("\t数学:%s\n",vIew->pnext->math);
                printf("\n\t...................................................\n");
                vIew->pnext=vIew->pnext->pnext;
                }
        }
        free(vIew);
        vIew=NULL;

        printf("\n\t┕====================显示信息完毕================┙\n");

}

//查找信息
void Search()                                                
{
        char serach[N];
        int flag=0;
        char choice='0';
        STU* vIew = NULL;

        system("cls");
                                                                        //选择查找的根据[学号/姓名]
        printf("\n\t输入指令\t 1、按照学号查找 \t2、按照姓名查找\n");
        choice = getch();

        if(choice=='1')
                printf("\t请输入要查找的学生的学号:\n");
        else if(choice=='2')
                printf("\t请输入要查找的学生的姓名:\n");
        else
                printf("\t您的指令输入有误!已经退出查找\n");

        if(choice=='1'||choice=='2')        //如果指令是正确的
        {
                scanf("%s",serach);

        
                vIew = (STU *)malloc(sizeof(STU));

                vIew->pnext=pStu->pnext;
                while(vIew->pnext!=NULL)
                {
                        if((strcmp(vIew->pnext->num,serach)==0&&choice == '1')||(strcmp(vIew->pnext->name,serach)==0&&choice == '2'))
                        {flag=1;
                        printf("\t学号:%s\n",vIew->pnext->num);
                        printf("\t姓名:%s\n",vIew->pnext->name);
                        printf("\t语文:%s\n",vIew->pnext->chinese);
                        printf("\t数学:%s\n",vIew->pnext->math);
                        printf("\n\t...................................................\n");
                        }
                vIew->pnext=vIew->pnext->pnext;
                }
                free(vIew);
                vIew=NULL;

                if(!flag)
                printf("\n!!!!!!!!!!!!!!!!!!!!对不起,查无此人!!!!!!!!!!!!!!!!!!!!!!!!!\n");
        }

}
//删除信息
void Delete()                                                        
{        
        STU *temp;
        char num_serach[N];
        int flag=0;
        STU* vIew = NULL;

        system("cls");

        temp=(STU *)malloc(sizeof(STU));
        
        
        printf("\n\t请输入要删除的学生的学号:\n");
        scanf("%s",num_serach);



        vIew = (STU *)malloc(sizeof(STU));
        
        vIew->pnext=pStu;
        while(vIew->pnext->pnext!=NULL)
        {
                if(strcmp(vIew->pnext->pnext->num,num_serach)==0)                //匹配到了学号
                {
                flag=1;
                printf("\n\n\t待删除的学生信息为:\n");
                printf("\t学号:%s\n",vIew->pnext->pnext->num);
                printf("\t姓名:%s\n",vIew->pnext->pnext->name);
                printf("\t语文:%s\n",vIew->pnext->pnext->chinese);
                printf("\t数学:%s\n",vIew->pnext->pnext->math);
                
                temp ->pnext=vIew->pnext->pnext;                                                //temp->next保存将要删除的节点的地址
                vIew->pnext->pnext=vIew->pnext->pnext->pnext;                        //绕过将要删除的节点

                free(temp->pnext);                                                                                //释放已经被绕过的节点,节省空间
                
                printf("\n\t待删除的学生已经删除\n");                        
                printf("\n\t...................................................\n");
                break;                                                                                                        //删除一个节点之后,跳出循环体
                }
                vIew->pnext=vIew->pnext->pnext;
        }

        free(vIew);
        vIew=NULL;
        free(temp);
        temp=NULL;

        if(!flag)
        printf("\n!!!!!!!!!!!!!!!!!!!!对不起,查无此人!!!!!!!!!!!!!!!!!!!!!!!!!\n");

}
//修改信息
void Modify()                                                                
{        
        char num_serach[N];
        int flag=0;
        STU* vIew = NULL;
        
        system("cls");
        
        printf("\n\t请输入要修改的学生的学号:\n");
        scanf("%s",num_serach);

        
        vIew = (STU *)malloc(sizeof(STU));

        vIew->pnext=pStu->pnext;
        while(vIew->pnext!=NULL)
        {
                if(strcmp(vIew->pnext->num,num_serach)==0)
                {
                        flag=1;
                printf("\t学号:%s\n",vIew->pnext->num);
                printf("\t姓名:%s\n",vIew->pnext->name);
                printf("\t语文:%s\n",vIew->pnext->chinese);
                printf("\t数学:%s\n",vIew->pnext->math);
                printf("\t修改成:\n");
                //新信息的输入
                printf("\t语文:\n");
                scanf("%s",vIew->pnext->chinese);
                //信息检查
                SecureCheck(vIew->pnext->chinese,"语文");

                //信息检查
                printf("\t数学:\n");
                scanf("%s",vIew->pnext->math);
                //信息检查
                SecureCheck(vIew->pnext->math,"数学");
                //信息检查
                
                //AddInformation();        //原则上不修改学号和姓名;但如果要;可以直接用AddInformation()函数
                                                        //去代替新信息的输入
                printf("\n\t...................................................\n");
                }
                vIew->pnext=vIew->pnext->pnext;
        }
        free(vIew);
        vIew=NULL;

        if(!flag)
        printf("\n!!!!!!!!!!!!!!!!!!!!对不起,查无此人!!!!!!!!!!!!!!!!!!!!!!!!!\n");
        
}
//数据统计
void Statistical()
{
        double score    = 0;
        int    Number   = 0;
        int    Over90   = 0;
        int    Below60  = 0;

        STU *View = NULL;
        View = pStu->pnext;
        
        system("cls");

        printf("\t进行数据统计:\n");
        while(View!=NULL)
        {        
                score += atof(View->math) + atof(View->chinese);
                if(atof(View->math)<60||atof(View->chinese)<60)
                {
                        Below60++;
                }
                if(atof(View->math)>=90&&atof(View->chinese)>=90)
                {
                        Over90++;
                }

                Number++;
                View = View->pnext;
        }
        printf("\n\t学生的总人数是:%d",Number);

        if(Number!=0)
                printf("\n\t学生的总平均分是:%.2f",score/Number);
        else
                printf("\n\t学生的总平均分是:0");

        printf("\n\t学生总分数是:%.2f",score);
        printf("\n\t存在不及格科目的学生的人数是:%d",Below60);
        printf("\n\t两科分数均达到90的学生人数是:%d",Over90);
}
//根据总成绩进行排序[改变指针指向的方法进行链表排序]
void Sort()                                                                                
{        
        STU *View_0 = NULL;
        STU *View_1 = NULL;
        STU *View_2 = NULL;
        int StudentNumber = 0;
        int i = 0,j = 0;
        float SortKey1 = 0,SortKey2=0,result=0;                                //排序因素
        char  Choice = 0;
        
        system("cls");
        printf("\n1.以学号为依据排序 2.以总分为依据排序: ");
        Choice = getch();
        printf("%c",Choice);

        while(Choice!='1'&&Choice!='2')
        {        printf("\n输入错误!重新输入  1.以学号为依据排序 2.以总分为依据排序: ");
                Choice = getch();
                printf("%c",Choice);
        }

        
        View_0 = pStu->pnext;
        while(View_0!=NULL)
        {
                View_0 = View_0 ->pnext;
                StudentNumber++;
        }
        printf("\n学生的个数为%d\n",StudentNumber);
        
        if(StudentNumber<2)
        {
                printf("\n表内学生数据少于2个,无需排序\n");//只有头结点或者除了头结点之外只有一个节点,不用排序
        }
        else
        {        
                
                //exchange A(View_1)and B(View_2)                                //冒泡排序
                for(i=0;i<StudentNumber-1;i++)
                {        
                        View_0 = pStu;
                        View_1 = pStu->pnext;
                        View_2 = View_1->pnext;

                        for(j=0;j<StudentNumber-1-i;j++)
                        {        
                                if(Choice=='2')                                                                                //排序因素:是拿什么来排序?
                                {        //学生的总成绩为排序因素
                                        SortKey1 = atof(View_1->math)+atof(View_1->chinese);
                                        SortKey2 = atof(View_2->math)+atof(View_2->chinese);
                                        result = (SortKey1)<(SortKey2)? 1:0;
                                }
                                else
                                {        //学生的学号为排序因素
                                        SortKey1 = atoi(View_1->num);
                                        SortKey2 = atoi(View_2->num);
                                        result = (SortKey1)>(SortKey2)? 1:0;
                                }
                                if(result)
                                {
                                //        printf("%\n%s与%s交换",View_1->num,View_2->num);
                                        View_0->pnext = View_2;
                                        View_1->pnext = View_2->pnext;
                                        View_2->pnext = View_1;        
                                        
                                        View_1 = View_2;
                                        View_2 = View_1->pnext;
                                        

                                }
                                if(View_2->pnext!=NULL)                                        
                                {
                                        View_0 = View_0->pnext;
                                        View_1 = View_0->pnext;
                                        View_2 = View_1->pnext;
                                }
                                
                                //如果最后节点的pnext是空,证明排序完毕,不需要再递进了
                        }
                }
                                printf("\n排序完毕\n");
                        
        }


        
}
//保存信息
void save_file()                                                                
{        
        FILE *file=NULL;
        STU* vIew = NULL;


        file = fopen("C:\\student_file.txt","w+");
        if(file==NULL)
                printf("文件打开失败!\n");
        
        vIew = (STU *)malloc(sizeof(STU));

        vIew->pnext=pStu->pnext;
        while(vIew->pnext!=NULL)
        {
        fputs(vIew->pnext->num,file);
        fputc(0x20,file);
        fputs(vIew->pnext->name,file);
        fputc(0x20,file);
        fputs(vIew->pnext->chinese,file);
        fputc(0x20,file);
        fputs(vIew->pnext->math,file);
        fputc(0x20,file);
        vIew->pnext=vIew->pnext->pnext;
        }
        free(vIew);
        vIew=NULL;        
        
        fputs("END_OF_FILE",file);
        fputc(0x20,file);

        fclose(file);
}
//从文件读入信息
void read_file()                                                                
{        
        int i=0;

        
        FILE *file=NULL;
        file = fopen("C:\\student_file.txt","r");

        if(file==NULL)
        {
                save_file();
                file = fopen("C:\\student_file.txt","r");
        }

        rewind(file);

        pCurrent ->pnext =pStu;
                
        while(1)
        {        pNew = (STU *)malloc(sizeof(STU));
                pNew->pnext = NULL;


                fscanf(file,"%s",pNew->num);
                if(strcmp(pNew->num,"END_OF_FILE")==0)        break;

                fscanf(file,"%s",pNew->name);
                fscanf(file,"%s",pNew->chinese);
                fscanf(file,"%s",pNew->math);
                
                
                pCurrent->pnext->pnext=pNew;                        
                pCurrent->pnext = pCurrent->pnext->pnext;
                //pCurrent->pnext指向现在存在的节点
        
        }
        fclose(file);

}
//短暂延时效果
void Delay()                                                                                                                        
{
        int i = 0;
        int j = 0;

        for(i=50000;i>0;i--)
                for(j=5000;j>0;j--)
                        ;
}
//系统初始化
void init()                
{
        pStu = (STU *)malloc(sizeof(STU));                                        //创建头节点
        pStu->pnext  =NULL;
        strcpy(pStu->num, "0");
        strcpy(pStu->name, " ");

        pCurrent = (STU *)malloc(sizeof(STU));
        pCurrent ->pnext =NULL;

        read_file();

}
//欢迎使用
void Welcome()                                                                        
{        system("cls");
        
        printf("\n\n\t┌================================================┑\n");
        printf("\n\n");
        printf("\t\t★★★欢迎使用学生信息管理系统★★★\n\n\n");
        printf("\t\t\t1.查看信息\n");
        printf("\t\t\t2.增加信息\n");
        printf("\t\t\t3.查找信息\n");
        printf("\t\t\t4.修改信息\n");
        printf("\t\t\t5.删除信息\n");
        printf("\t\t\t6.学生排序\n");
        printf("\t\t\t7.数据统计\n");
        printf("\t\t\t8.退出系统\n");
        printf("\n\n\t┕================================================┚\n");
}
/************************************主函数************************************/
int main()
{
        char choice  = 0;
        char AddYorN = 0;

        init();
        InCheck();
        Welcome();
//        MessageBox(0, "", 0);

                                                                                                                        //命令解释
        
        while(choice!='8')
        {        
                printf("\n>>");                                                                                //输入命令
                choice=getch();
                printf("%c",choice);

                switch(choice)
                {
                        case '1':ShowInformation();                
                                break;
                        case '2':        do
                                                {
                                                        AddInformation();        save_file();
                                                        printf("输入N可以退出增加信息.任意键继续输入\n");AddYorN=getch();printf("%c",AddYorN);
                                                }while(AddYorN!='N');
                                break;        
                        case '3':Search();
                                break;        
                        case '4':Modify();        save_file();        
                                break;
                        case '5':Delete();        save_file();
                                break;
                        case '6':Sort();        save_file();
                                break;
                        case '7':Statistical();
                                break;
                        case '8':
                                break;
                        default:printf("\t\t任意键返回主菜单\n");getch();Welcome();
                        
                }
}
        
    system("cls");
        system("color 81");
        printf("\n\t\t感谢您的使用,再见!\n");
        Delay();

        
        save_file();
        return 0;

}

查看所有文章

Bandicam.v2.1.2.740+破解软件

Bandicam是一款由韩国开发的高清视频录制的电脑软件。Bandicam可录制分辨率高达2560×1600高画质视频,Bandicam录制的时,可添加自己的LOGO到视频中,Bandicam可支持bmp、 png 、 jpeg 格式截图。Bandicam支持CUDA/NVENC/Intel Quick Syuc和多种外置编解码器,可供用户自定义录制代码。Bandicam体积小巧便于携带是录制视频不错的选择.

下载链接
链接: http://pan.baidu.com/s/1jI5jgjk 密码: s76d

完美的Microsoft Visual C++ 6.0 (简称VC6.0)

注意!该软件目前系统已知不兼容Windows 10操作

Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)是Microsoft公司推出的以C++语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过的设置就可使其生成的程序框架支持数据库接口、OLE2.0,WinSock网络。[1]

Microsoft Visual C++ 6.0,简称VC6.0,是微软于1998年推出的一款C++编译器,集成了MFC
 6.0,包含标准版(Standard Edition)、专业版(Professional Edition)与企业版(Enterprise Edition)[2]
 。发行至今一直被广泛地用于大大小小的项目开发。(但是,这个版本在Windows XP
下运行会出现问题,尤其是在调试模式的情况下(例如:静态变量的值并不会显示)。这个调试问题可以通过打一个叫“Visual C++ 6.0 Processor Pack”的补丁[3]
 来解决。)

链接: https://pan.baidu.com/s/1bp4JsWB 密码: kyst

关于使用NetBeans的Tomcat服务器时出现的”指定的服务器位置 (Catalina Home) 文件夹无效”问题

之前使用NetBeans的时候多半用的都是glassfish服务器,这次想要用Apache Tomcat9时,然后选择Tomcat的文件夹后提示出现“指定的服务器位置 (Catalina Home) 文件夹无效”问题,经过一番调查后,才知道,NetBeans并不兼容过早版本的Tomcat。

我使用的NetBeans8.1  后来将Tomcat9 改为Tomcat7 就解决了