| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 865 人关注过本帖
标题:c语言 用链表读取文件,进行操作,能运行了,可是各项功能无法实现,输出还 ...
只看楼主 加入收藏
苏白茶
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-11-23
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
c语言 用链表读取文件,进行操作,能运行了,可是各项功能无法实现,输出还乱码,
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>
# define LEN sizeof(struct Medical)
struct Medical{
 int num;
 char siteid[10];
 char disease[10];
 char office[10];
 struct Medical * next;
};
struct Medical * creat(){
struct Medical * head;
struct Medical * p1,* p2;
 head=NULL;
 FILE * fp;
if ((fp=fopen("G:\\medical.txt","r"))==NULL){
       printf("cannot open file\n");
       exit(0);
  }
 head=(struct Medical *)malloc(LEN);
 memset(head,0,LEN); //防止字符乱码,不知道对不对
 head->next=NULL;
 p2=head;
 while (!feof(fp)){
    p1=(struct Medical *)malloc(LEN);
    memset(p1,0,LEN);   //防止字符乱码
    p1->next=NULL;
    fread(p2,LEN,1,fp);
    p2->next=p1;
    p2=p1;
 }
if (feof(fp)){
       p2->next=NULL;
       return (head);
    }
 return (head);
}
struct Medical * insert(struct Medical* head,struct Medical * med){
 struct Medical * p0,* p1,* p2;
 p1=head;
 p0 =med;
 while ((p0->num > p1->num)&&(p1->next!=NULL)){
   p2=p1;
   p1=p1->next;
 }
       p2->next=p0;
 if(p0->num <= p1->num){
    if(head==p1)
       head=p0;
    else
       p2->next=p0;
       p0->next=p1;
       }
 else{
    p1->next=p0;
    p0->next=NULL;
 }
 return(head);
}
struct Medical * delet (struct Medical * head,int number ){
    struct Medical * p1,* p2;
    p1=head;
    while (number!=p1->num && p1->next!=NULL){
      p2=p1;
      p1=p1->next;
    }
    if(number == p1->num){
      if(p1 == head)
          head=p1->next;
      else
          p2->next=p1->next;
          printf("已删除\n");
    }
    else
     printf("没有发现要删除的项目\n");
     return (head);
 }
void print(struct Medical * head){
 struct Medical * p;
 printf("全部信息为:\n");
 p=head;
 do{
  printf(" %d     %s     %s    %s",p->num,p->siteid,p->disease,p->office);
  p=p->next;
 }while(p!=NULL);
}
void sort(){
struct Medical * p1,* p2,* p0;
struct Medical * head;
 for(p1=head;p1!=NULL;p1->next){
     for(p2=p1->next;p2!=NULL;p2->next){
         if(p1->siteid>p2->siteid){
            p0=p1;
            p1=p2;
            p2=p0;
         }
     }
 
 }
}
void find(){
   struct Medical * head;
   struct Medical * p;
   char id[10]={0},dise[10]={0},offi[10]={0};
   int n,number;
   printf("1、按siteid查找\n2、按疾病名称查找\n3、按科室查找\n4、按序号查找\n请选择\n");
   scanf("%d",&n);
   if(n==1){
    printf("请输入siteid\n");
    scanf("%s",id);
     for(p=head;p!=NULL;p->next){
      if(strcmp(id,p->siteid)==0)
          printf("%d      %s     %s    %s",p->num,p->siteid,p->disease,p->office);
      else
          printf("无法找到信息\n");
    }
   }

  else if(n==2){
  printf("请输入disease\n");
  scanf("%s",dise);
  for(p=head;p!=NULL;p->next){
      if(strcmp(dise,p->disease)==0)
          printf("%d     %s     %s    %s",p->num,p->siteid,p->disease,p->office);
      else
          printf("无法找到信息\n");
   }
  }
  else if(n==4){
    printf("请输入number\n");
    scanf("%d",&number);
    for(p=head;p!=NULL;p=p->next){
      if(number==p->num)
          printf("%d%s%s%s",p->num,p->siteid,p->disease,p->office);     
      else
          printf("无法找到信息\n");
   }
  
  
  }
  else {
   printf("请输入office\n");
   scanf("%s",offi);
   for(p=head;p!=NULL;p->next){
       while(strcmp(offi,p->office)==0){
          printf("%d    %s     %s    %s",p->num,p->siteid,p->disease,p->office);
       }
   }
  }
}
int main (){
   
 struct Medical * creat();
 struct Medical*insert(struct Medical *,struct Medical *);
 struct Medical* delet(struct Medical *,int );
 void print(struct Medical* head);
 void sort();
 void find();
 int i,number;
 struct Medical med;
 struct Medical * head;
 char id[10]={0};
 FILE * fp;
 if ((fp=fopen("G:\\medical.txt","r"))==NULL){
       printf("cannot open file\n");
       exit(0);
  }
  head=creat();
  printf("          1、查找项目\n          2、项目排序\n          3、删除项目\n          4、添加项目\n          5、退出\n");
  scanf("%d",&i);
  switch(i){
   case 1:
       find();
       break;
   case 2:
       sort();
       print(head);
       break;
   case 3:
       printf("请输入要删除的项目序号\n");
       scanf("%d",&number);
       head=delet(head,number);
       print(head);
       break;
   case 4:
       printf("请输入要插入的项目\n");
       scanf("%d %s %s %s",&med.num,med.siteid,med.disease,med.office);
       head=insert(head,&med);
       print(head);
       break;
   case 5:
       exit(0);
       break;
}
    fclose(fp);   
    return 0;
}
搜索更多相关主题的帖子: include office cannot c语言 file 
2014-11-23 09:43
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:20 
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>
# define LEN sizeof(struct Medical)
struct Medical{
    int num;
    char siteid[10];
    char disease[10];
    char office[10];
    struct Medical * next;
};
struct Medical * creat(){
    struct Medical * head;
    struct Medical * p1,* p2;
    head = NULL;
    FILE * fp;
    if ((fp=fopen("G:\\medical.txt","r")) == NULL){
    printf("cannot open file\n");
    exit(0);
    }
    head=(struct Medical *)malloc(LEN);
    memset(head,0,LEN); //防止字符乱码,不知道对不对
    head->next=NULL; //其实上面已经清零了,没有必要了
    p2=head;
    while (!feof(fp)){
    p1=(struct Medical *)malloc(LEN);
    memset(p1,0,LEN);   //防止字符乱码,其实没有必要,因为下面马上覆盖了。
    p1->next=NULL;
    fread(p2,LEN,1,fp); //有问题应该是fread(p1,LEN,1,fp),第一个为头节点,不用插入数据,这样在插入删除时不用考虑没有节点或者只有一个节点情况;且读取的文件必须是经过fwrite(p2,LEN,1,fp)函数写入二进制文件,里面还有一个问题就是还把指针也存入了文本中,在读取数据时这个数据单元是无效的。
    p2->next=p1;
    p2=p1;
    }
    /*if (feof(fp)){//没用
        p2->next=NULL;
    return (head);
    }*/
    return (head);
}

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-23 14:47
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:0 
程序代码:
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>

struct Medical{
    int num;
    char siteid[10];
    char disease[10];
    char office[10];
};
struct LNode
{
    struct Medical medical;
    struct LNode * next;
};
struct LinkList //带有头结点的单链表
{
    struct LNode * head, *tail; //head指向头节点,tail指向尾节点
    int length; //整个链表的长度
};

int InitLinkList(struct LinkList * L){
    /*构造一个空的链表*/
    struct LNode * p = NULL;
    p = (struct LNode *)malloc(sizeof(struct LNode));
    if(p){
    p->next = NULL;
    L->head = L->tail = p;
    L->length = 0;
    return 1;
    }
    return 0;
}

int InsTail(struct LinkList * L, struct LNode* node ){
    /*node指向要插入的节点,函数将把该节点插入到链表尾部*/
    L->tail->next = node;
    L->tail = node;
    ++L->length;
    return 1;
}

int MakeNode(struct LNode **p){//传入二级指针用来返回函数中指针
    *p = (struct LNode *)malloc(sizeof(struct LNode));
    if(!(*p)){
    return 0;
    }
    (*p)->next = NULL;
    return 1;
}

struct LNode * FindNode(const struct LinkList *L, int kinds, char * temp){
    /*根据查找种类,以及相应的查找参数对链表进行查找,若找到返回节点指针,否则返回NULL*/
    struct LNode *p = NULL;
    for(p = L->head->next; p != NULL; p = p->next){
    if(kinds == 1 && p->medical.num == atoi(temp)){
        return p;
    }
    else if (kinds == 2 && strcmp(p->medical.siteid,temp) == 0){
        return p;
    }
    else if(kinds == 3 && strcmp(p->medical.disease,temp) == 0){
        return p;
    }
    else if(kinds == 4 && strcmp(p->medical.office, temp) == 0){
        return p;
    }
    }
    return p;
}

int DelNode(struct LinkList * L, struct LNode * node){
    struct LNode * pre = L->head;
    for(;pre->next != node && pre != L->tail; pre = pre->next );
    if(pre->next == node){
    pre->next = node->next;
    free(node);
    if(node == L->tail)
        L->tail = pre;
    return 1;
    }
    return 0;
}

void print(const struct LinkList * L){
    /*打印整个链表*/
    struct LNode * p;
    printf("全部信息为:\n");
    p = L->head->next;
    printf("============================================================\n");
    printf("\t序号\tsiteid\t疾病\t科室\n");
    while(p){
    printf("\t%d\t%s\t%s\t%s\n",p->medical.num,p->medical.siteid,p->medical.disease,p->medical.office);
    p = p->next;
    }
    printf("============================================================\n");
}

void NodePrint(struct LNode * p){
    /*打印某个节点*/
   printf("============================================================\n");
   printf("\t序号\tsiteid\t疾病\t科室\n");
   printf("\t%d\t%s\t%s\t%s\n",p->medical.num,p->medical.siteid,p->medical.disease,p->medical.office);
   printf("============================================================\n");
}

int ReadToMemory(struct LinkList * L,const char * str){
    /*从指定文件输入信息*/
    FILE *fp = NULL;
    if ((fp=fopen(str, "rb")) == NULL){
    printf("cannot open file\n");
    return 0;
    }

    while (!feof(fp)){
    struct LNode * temp = NULL;
    if(!(MakeNode(&temp) && (fread(&temp->medical,sizeof(struct Medical),1,fp)) == 1 && InsTail(L, temp))){
        free(temp); //插入数据到内存不正确,则释放掉内存
        fclose(fp); //关闭文件
        return 0;

    }
    }
    fclose(fp);
    return 1;
}

int WriteToText(struct LinkList * L, const char * str){
    /*从内存写入到硬盘文件中*/
    FILE *fp = NULL;
    if((fp = fopen(str,"wb+")) == NULL){
    printf("cannot open file\n");
    exit(0);
    }
    struct LNode * node = L->head->next;
    while(node){
    if(fwrite(&(node->medical), sizeof(struct Medical),1,fp) == 1){
        node = node->next;
    }
    }
    if(node == NULL)
    return 1;
    else
    return 0;
}

int NumCompare(const struct LNode * a, const struct LNode * b){
    /*根据medical的num来比较*/
    if((a->medical.num) < (b->medical.num))
     return 1;
    else
    return 0;
}

int SiteidCompare(const struct LNode * a, const struct LNode * b){
    /*根据medical的siteid来比较*/
    if(strcmp(a->medical.siteid, b->medical.siteid) < 0)
    return 1;
    else
    return 0;
}
//根据疾病或者科室排序可以参照上面函数

void Sort(struct LinkList * L, int (*compare)(const struct LNode *, const struct LNode *)){
    /*根据传入的比较函数来进行升序排序*/
    struct LNode *p, *q, *min, *pmin;

    p = L->head; //指向头结点
   

    while(p->next){ //选择排序思想
    min = p->next; //p指针前面的节点为有序链表,p为有序链表最后一位
    for(q = min; q->next != NULL; q = q->next){
        if(compare(q->next,min)){
        pmin = q;
        min = q->next;
        }
    }
    if(min == p->next){//最小节点为无序节点的第一个节点
        p = p->next;
    }
    else if(min != p->next){//最小节点为无序链表第一位之后某位
        pmin->next = min->next; //在无序链表中删除最小节点
        min->next = p->next; //在有序链表末尾插入
        p->next = min;
        p = p->next;
    }
    }
    L->tail = p; //最后一个节点必定是最大的,所以不用处理,直接把有序链表尾指针指向该节点
}

void Find_Sub(struct LinkList * L){
    int n = 0;
    char temp[10] = {0};
    struct LNode * p = NULL;

    while(1){
    printf("\t1、按序号查找\n\t2、按siteid查找\n\t3、按疾病名称查找\n\t4、按科室查找\n");
    printf("输入格式为\"菜单选项:相应的查找数据,例如 1:30 表示按序号查找序号为30的节点数据(退出输入0:0)\"\n");
    scanf("%d:%s",&n,temp);
    if(n == 0)  //如果输入节点序号为0,则结束输入
        break;
    if((p = FindNode(L, n, temp))){
        NodePrint(p);
    }
    else
        printf("没有找到你要的信息!\n");
    }
}

void Sort_Sub(struct LinkList * L){
    int num;

    while(1){
    print(L);
    printf("\t1、按序号排序\n\t2、按siteid排序\n");
    printf("\t请输入按什么排序(输入0退出):\n");
    scanf("%d",&num);
    if(num == 0)
        break;
    if(num == 1){
        Sort(L, NumCompare);
    }
    else if(num == 2){
        Sort(L, SiteidCompare);
    }else
        printf("你输入的选项错误!\n");
    }
}

void Del_Sub(struct LinkList * L){
    int number;
    char temp[10]={0};
    struct LNode * p = NULL;

    while (1) {
    print(L);
    printf("\t1、按节点序号删除\n\t2、按siteid删除\n\t3、按疾病删除\n\t4、按科室删除\n");
    printf("请输入按什么种类删除什么:\n");
    printf("输入格式为\"菜单选项:相应的查找数据,例如 1:30 表示按序号删除序号为30的节点数据。(退出请输入0:0)\"\n");
    scanf("%d:%s",&number,temp);
    if(number == 0)  //如果输入节点序号为0,则结束输入
        break;
    if((p = FindNode(L, number, temp)) != NULL){
        if(DelNode(L, p))
            printf("数据删除成功!\n");
        else
            printf("数据删除失败!\n");
    }
    else
        printf("没有找到你要删除的信息!\n");
    }
}

void Ins_Sub(struct LinkList * L){
    /*插入子菜单控制逻辑*/

    while(1){
    print(L);
    printf("分别输入序号,siteid,疾病,科室的输入信息的格式如下(退出输入0 0 0 0):\n");
        printf("1 001 结石 泌尿科回车\n");
    struct LNode * temp = NULL;
    struct LNode node;
    char str[10]; //临时存储num转换为字符串
    fflush(stdin);//请空键盘缓冲区
    int len = scanf("%d%s%s%s",&node.medical.num,node.medical.siteid,node.medical.disease,node.medical.office);
    fflush(stdin);

    if(node.medical.num <= 0)
        break; //当输入节点序号小于或等于0时,结束输入

    sprintf(str,"%d",node.medical.num); //把数字转换为字符串,linux 下标准中没有itoa()
    printf("%s\n", str);
    if(len == 4 && node.medical.num >0 && !FindNode(L, 1, str)){//当输入值符合4个且序号大于零且在链表中没有,则可以插入
        MakeNode(&temp);
        temp->medical.num = node.medical.num; //结构体赋值
        strcpy(temp->medical.siteid,node.medical.siteid);//注意字符串不能直接赋值
        strcpy(temp->medical.disease,node.medical.disease);
        strcpy(temp->medical.office,node.medical.office);
        InsTail(L, temp); //插入到链表尾部
        printf("数据插入成功!\n");
    }
    else
        printf("数据插入失败!\n");
    }
}

void Write_Sub(struct LinkList * L, const char * str){
    if(WriteToText(L, str)){
    printf("写入成功!\n");
    }
    else
    printf("写入失败!\n");
}

int main (){
    struct LinkList L;
    int i;
    if(!InitLinkList(&L))
    exit(0); //初始化失败,结束程序
    const char * text = "/home/lzh/test.dat";
    ReadToMemory(&L, text); //读取文件数据
    print(&L);
    while(1){
    printf("\t1、查找项目\n\t2、项目排序\n\t3、删除项目\n\t4、添加项目\n\t5、保存数据\n\t6、退出\n");
    scanf("%d",&i);
    if(i >= 6)
        break;
    switch(i){
    case 1:
        Find_Sub(&L);
        break;
    case 2:
        Sort_Sub(&L);
        break;
    case 3:
        Del_Sub(&L);
        break;
    case 4:
        Ins_Sub(&L);
        break;
    case 5:
        Write_Sub(&L, text);
        break;
    default:
        exit(0);
        break;
    }
    }
    return 0;
}

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-24 15:27
快速回复:c语言 用链表读取文件,进行操作,能运行了,可是各项功能无法实现,输 ...
数据加载中...
 
   



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

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