读取文件建立顺序表实现增,删,查,取(C语言)

一个简单的顺序表实现一组学生信息增,删,查,取功能。文件导入部分的处理花费了较多时间

代码如下:

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

#define maxsize 30
#define OVERFLOW -2
#define OK 1


typedef struct{
  char name[8];
  int  id;
  int score;
}student;

typedef struct{
 student *elem;
 int length ;
}sqlist;

函数方法: 初始化


int InitList(sqlist *L)
{
   L->elem=(student*)malloc(sizeof(student)*maxsize);
   if(!L->elem)  exit(OVERFLOW);
	L->length=0;
	return OK;
}

void Openfile(sqlist *L){
   int i=0;
   FILE *fp;
   fp =fopen("mmp.txt","r");     
    if((fp=fopen("mmp.txt","r"))==NULL)
     {
      printf("can't open the file!!!\n");
      printf("error:%s\n",strerror(errno));
      exit(0);
     }
    while(!feof(fp))
	{
		fscanf(fp,"%s%d%d",L->elem[i].name,&L->elem[i].id,&L->elem[i].score); 
		 /*fscanf()格式化读文件函数,这个函数以空格或换行区分两个不同的数据,如果使     
		 用自己编写的文本,文本每个元素之间最好保持一个空格不要多个空格以免
		 出现不必要的错误*/
		printf("%s%d%d\n",L->elem[i].name,L->elem[i].id,L->elem[i].score);
		i++;
		L->length++;
	}
	fclose(fp);
}

插入与删除


int InsertList(sqlist *L){
    int j,i;
    student s;
    printf("================输入要插入的学生信息==============\n");
    printf("*****姓名:");	scanf("%s",s.name);
	printf("*****学号:");	scanf("%d",&s.id);
	printf("*****成绩:");	scanf("%d",&s.score);
	printf("输入完成\n\n");
    printf("输入要插入的位置信息:");
    scanf("%d",&i);
    if((i<1)||(i>L->length+1)) return 0;
    if(L->length==maxsize) return 0;
    for(j=L->length-1;j>=i-1;j--){
      L->elem[j+1]=L->elem[j];
   }
   L->elem[i-1]=s;
   L->length++;
}

int DeleteList(sqlist *L){
  int j,i;
  printf("输入要删除位置");
  scanf("%d",&i);
  if((i<1)||(i>L->length+1)) return 0;
  for(j=i-1;j<L->length-1;j++){
  L->elem[j]=L->elem[j+1];
  }
  L->length--;
  return OK;
}

查找取值


int LocateElem(sqlist *L){
   int k,i=0;
   printf("输入要查找的学号\n") ;
   scanf("%d",&k);
   for(i=0;i<L->length;i++){
    if(L->elem[i].id==k) printf("该生的成绩为:%d\n",L->elem[i].score);
}
   return 0 ;
}

int GetElement(sqlist *L){
    int i;
    student e;
    printf("输入取值位置信息\n");      scanf("%d",&i);
    if((i<1)||(i>L->length+1)) return 0;
    e=L->elem[i-1];
    printf("********该学生的信息********\n");
    printf("姓名: %s\n",e.name);
	printf("学号: %d\n",e.id);
	printf("成绩: %d\n",e.score);

    return OK;
}

打印


void printList(sqlist *L){
   int i=0;
   printf("====================学生成绩表==================\n");
   for(i=0;i<L->length;i++){
   printf("姓名:%s\n",L->elem[i].name);
   printf("学号:%d\n",L->elem[i].id);
   printf("成绩:%d\n\n",L->elem[i].score);
}
   printf("\n");
}

主函数:

int main(){
    sqlist L;
    InitList(&L);             /*初始化*/
    Openfile(&L);             /*导入文件*/
    printList(&L);

    InsertList(&L);          /*增,删,查,取*/
    printList(&L);

    DeleteList(&L);
    printList(&L);

    LocateElem(&L);
    GetElement(&L);
    return 0;
}

转载于:https://my.oschina.net/u/4189247/blog/3093140

  • 12
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值