C语言课程设计--学生通讯录1.0

来源:互联网 发布:mac双系统多分区 编辑:程序博客网 时间:2024/04/29 05:52

暑假用了三天写的C语言课程设计———学生通讯录,还有待完善,就暂且称为1.0版本吧(初具功能,但有缺陷)。
使用的开发软件是 C/C++程序设计学习与试验系统,这个开发软件感觉还不错,支持C++还有中文显示,并且里面还有大量的习题。不过如果想要是自己的编程更加规范,还是TC++3.0比较好。
学生通讯录主要用到的知识点主要是链表的操作如:建立链表、删除链表、插入链表、查找链表等

#include<stdio.h>
#include<windows.h>
#include<conio.h>
                         /*预定义*/
#define MAX 50
#define OK 1
#define TRUE 1 
#define ERROR 0   
#define FALSE 0                  
                                     /*结构体定义*/
typedef struct address
{
 char num[20];
 char name[20];
 char phone[25];    
 struct address *next;               /*结构体指针*/
};
      /*全局变量*/
FILE *fp,*pf;                        /*文件指针*/
struct address * head;
int i=0;                             /*计算信息个数*/
      /*函数声明*/
void gotoxy(int x,int y);            /*光标定位函数*/
struct address* create(void);
int print(struct address *head);
int search(struct address *head);
struct address *insert(struct address *head);
struct address *dele(struct address *head);
struct address *sort(struct address *head);
int save(struct address *head);
struct address * load(void);

void gotoxy(int x,int y)             /*光标定位函数*/
{
 COORD coord;
 coord.X=x;
 coord.Y=y;
 SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}                   
                                     /*建立链表函数*/
struct address* create(void)         /*()里返回类型可以是void或者struct address * head*/
{                                    /*之所以要返回是因为其他函数要用到头指针*/
 int flag1=0;
 char ch;
 struct address *p,*q;
 system("cls");
 i=0;
 if(!(p=q=(struct address*)malloc(sizeof(struct address))))
  {
      printf("内存分配出现错误!/n");
      printf("请按任意键返回主菜单.../n");
      getch();
      return ERROR;
  }
 head=NULL;
 printf("请输入学生的信息:学号:/n");
 scanf("%s",p->num);
 printf("请输入学生的信息:名字:/n");
 scanf("%s",p->name);
 printf("请输入学生的信息:电话:/n");
 scanf("%s",p->phone);
 head=p;
 q=p;
 flag1=1;
 i++;
 while(flag1)
 {
  printf("还要继续输入码?y/n/n");
  scanf("%s",&ch);                           /*不能用%c不知道为什么*/
  if(ch=='y')
  {
   if(!(p=(struct address*)malloc(sizeof(struct address))))
   {
      printf("内存分配出现错误!/n");
      printf("请按任意键返回主菜单.../n");
      getch();
      return ERROR;
   }
   q->next=p;
   q=p;
   printf("请输入学生的信息:学号:/n");
   scanf("%s",p->num);
   printf("请输入学生的信息:名字:/n");
   scanf("%s",p->name);
   printf("请输入学生的信息:电话:/n");
   scanf("%s",p->phone);
   i++;
  }
  else if(ch=='n')
  {
   flag1=0;
   q->next=NULL;                      /*如果不加此句的话,打印时会出现错误*/
   printf("请按任意键返回.../n");
   return ERROR;
  }
 }/*while*/
 q->next=NULL;
 return head;                        /*换成return (head);也可以*/
}/*create*/                         
 /*要解决输入一个时不出错的bug*/
                                     /*显示函数*/
           
int print(struct address *head)     /*因为要显示信息,所以就要传入参数,这里是传入链表的头指针*/

  struct address *p;                 /*用于取链表的下一个结点*/
  int j=0;
  p=head;   
  system("cls");
  if(!head)
  {
   printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");   
   return ERROR;
  }
  printf("按任意键显示已输入的信息.../n");   
  getch();
   while(p->next)
  {
   ++j;
   printf("这是第%d个学生信息",j);
   printf("该学生的学号是:");   
   printf("%s/n",p->num);   
   printf("该学生的名字是:");
   printf("%s/n",p->name);
   printf("该学生的联系方式是:");   
   printf("%s/n",p->phone);
   p=p->next; 
   if(j%20==0)
   {
       printf("按任意键进行翻页.../n");
       getch();
       system("cls");
       printf("第%d个学生信息",j);
    printf("该学生的学号是:");   
    printf("%s/n",p->num);   
    printf("该学生的名字是:");
    printf("%s/n",p->name);
    printf("该学生的联系方式是:");   
    printf("%s/n",p->phone);                             /*用于读取下一信息*/
   }
  }/*while*/
  if(p)
  {
   ++j;
   printf("第%d个学生信息",j);
   printf("该学生的学号是:");   
   printf("%s/n",p->num);   
   printf("该学生的名字是:");
   printf("%s/n",p->name);
   printf("该学生的联系方式是:");   
   printf("%s/n",p->phone);   
  }
  printf("已显示完,按任意键返回主菜单...");
  return OK;
}

            /*查找函数*/
int search(struct address *head)
{
  struct address *p,*q;
  int flags=1;
  q=(struct address*)malloc(sizeof(struct address));
  p=head;
  system("cls");
  if(!head)
  {
   printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");   
   return ERROR;
  }
  printf("请输入你想要查询的学生的学号:");
  scanf("%s",q->num);
  if(p->next)
 {
  while(p->next)
  {
    if(strcmp(q->num,p->num)==0)
    {
     printf("该学生的信息如下:/n");   
     printf("该学生的学号是:");   
     printf("%s/n",p->num);   
     printf("该学生的名字是:");
     printf("%s/n",p->name);
     printf("该学生的联系方式是:");   
     printf("%s/n",p->phone);
     flags=0;
     printf("按任意键返回主菜单...");            /*跳出循环,防止无限循环*/
     getch();
     return OK;
    }
    else
    {
     p=p->next;
    }
  }/*while*/
 }/*if*/
   if(strcmp(q->num,p->num)==0)
    {
       printf("该学生的信息如下/n:");   
     printf("该学生的学号是:");   
     printf("%s/n",p->num);   
     printf("该学生的名字是:");
     printf("%s/n",p->name);
     printf("该学生的联系方式是:");   
     printf("%s/n",p->phone);
     printf("按任意键返回主菜单...");
     getch();
     return OK;
    }
    else
   {
    printf("找不到学号为%s的学生信息...",q->num);
    printf("按任意键返回主菜单...");
    getch();
    return ERROR;
   }
}

            /*插入函数*/
struct address *insert(struct address *head)  /*可能会修改了链表的头指针,所以要返回头指针*/
{
  struct address *p,*q;
  char ch;
  q=p=(struct address *)malloc(sizeof(struct address));
  p=head;
  system("cls");
  if(!head)
  {
   printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");   
   return ERROR;
  }
  printf("请输入你要插入的学生信息:/n");
  printf("请输入学生的学号:");
  scanf("%s",q->num);
  printf("/n请输入学生的名字:");
  scanf("%s",q->name);
  printf("/n请输入学生联系方式:");
  scanf("%s",q->phone);
  printf("/n是否要保存该数据y/n?");
  scanf("%s",&ch);
  if(ch=='y')
  {
      printf("若要保存则保存并显示");
      for(;p->next;p=p->next);                         /*插入到最后一个结点*/
      p->next=q;
      q->next=NULL;
      i++;
      return head; 
  }
  else
   if(ch=='n')
  {
      printf("你输入的信息是:(你已选择不保存)");
      printf("该学生学号%s:/n",q->num);
      printf("该学生姓名%s:/n",q->name);
      printf("该学生联系方式%s:/n",q->phone);
  }
  return head;
}

            /*删除函数*/
struct address *dele(struct address *head)
{
 struct address *p,*q,*w;
 q=p=(struct address *)malloc(sizeof(struct address));
 system("cls");
 if(!head)
 {
  printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");   
  return ERROR;
 } 
 printf("请输入要删除学生信息的学号:");
 scanf("%s",q->num);
 p=head;
 if(strcmp(p->num,q->num)==0)                       /*只有一个学生信息并且匹配或者第一匹配*/
 {
  head=p->next;
  free(p);
  i--;
  printf("已经成功删除,按任意键返回主菜单S...");
  return head;
 }/*if*/
 while(p->next)                                     /*至少两个学生信息*/
 {
  w=p;
  p=p->next;   
  if(strcmp(p->num,q->num)==0)                     
  {
   w->next=p->next;
   free(p);
   i--;
   printf("已经成功删除,按任意键返回主菜单S...");
   return head;
  }
 } /*while*/
 if(strcmp(p->num,q->num)==0)                     
  {
   w->next=p->next;
   free(p);
   i--;
   printf("已经成功删除,按任意键返回主菜单S...");
   return head;
  }
 printf("找不到学号为%s的学生信息",q->num);
 printf("按任意键返回...");
 getch();
 return head;
}

            /*排序函数*/
struct address *sort(struct address *head)
{
 system("cls");
 if(!head)
  {
   printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");     
   return ERROR;
  }
 return head;
}

int save(struct address *head)
{
 char finame[30];
 struct address *p;
 p=head;
 system("cls");
 if(!head)
  {
   printf("学生信息为空,请你先在建立链表中输入信息,按任意键返回...");   
   return ERROR;
  }
  printf("请输入要保存的文件名:");
  scanf("%s",finame);
  if((pf=fopen(finame,"w+"))==NULL)
  {
   printf("保存文件失败!按任意键返回主菜单...");
   return ERROR;   
  }
  else
  {
      while(p)
      {
       fwrite(p,sizeof(struct address),1,pf);
       p=p->next;   
      }
   printf("保存文件成功!按任意键返回主菜单...");   
  }
  fclose(pf);
  return OK;
}
 
struct address * load(void)
{
 struct address *p,*q;
 char finame2[30];
 system("cls");
 printf("请输入你要打开的文件名:");
  scanf("%s",finame2);
 if((fp=fopen(finame2,"rb"))==NULL)  /*fp=fopen(finame2,"rb")外面要再加一层括号,不然会有wanning*/
 {
  printf("你要打开的文件为空或者不存在,按任意键返回...");
  return ERROR;    
 }
  i=0;                              /*i重新置为0*/
  head=(struct address *)malloc(sizeof(struct address));
  fread(head,sizeof(struct address),1,fp);/*把第一个元素赋给head*/
  i++;
  p=q=head;
  while((p->next)!=NULL)
  {
   p=(struct address *)malloc(sizeof(struct address));   
   fread(p,sizeof(struct address),1,fp);
   q->next=p;
   q=p;
   i++;
  }
  q->next=NULL;                    /*最后一定要的后继一定要置为NULL*/
  fclose(fp);                      /*关闭文件*/
  printf("读入文件成功,按任意键返回主菜单,可以在打印链表中查看信息...");
 return head;
}


void main()
{  
 /*struct address *p,*q;*/
 char ch;
 int x0,y0;
 while(1)
 {
  x0=22;
  y0=5;
  system("cls");
  gotoxy(x0,y0);   printf("+***********************************+/n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            1:建立链表            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            2:打印链表            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            3:查找信息            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            4:删除信息            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            5:插入信息            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            6:保存信息            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            7:打开文件            */n");
  gotoxy(x0,y0+=1);printf("|                                   |/n");
  gotoxy(x0,y0+=1);printf("*            0:退出系统            */n");
  gotoxy(x0,y0+=1);printf("+***********************************+/n");
  gotoxy(x0,y0+=1);printf("请从0至8中选择你要进行的操作:");
  scanf("%s",&ch);
  switch(ch)
 {
  case'1':create();break;
  case'2':print(head);break;
  case'3':search(head);break;
  case'4':dele(head);break;
  case'5':insert(head);break;                             /*还差保存显示功能*/
  case'6':save(head);break;
  case'7':load();break;
  case'0':exit(0);break;   
 }
  getch();
 }/*while*/
}           

原创粉丝点击