| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1247 人关注过本帖
标题:新手求教c语言链表程序!编译通过但是运行不出来!谢谢啦
只看楼主 加入收藏
jokerzhou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-9-9
收藏
 问题点数:0 回复次数:17 
新手求教c语言链表程序!编译通过但是运行不出来!谢谢啦
各位大神们,小妹乃大二学生,现有一链表程序编成后实在找不出错误,但一直出现联机解决的框框,晚上就要交~
求解哇!初来乍到,没有分,望谅解,如能回答,小妹感激不尽请大家多多指教~
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define  NULL 0
#define  LEN sizeof(struct person)
  struct person
  { char num[3];
  char name[8];
  char age[2];
  char tele[11];
  char addr[20];
  char email[20];
  struct person *next;
};                      //建立结构体//
  int n;
  struct person *head;

  
  struct person *creat(void)   //录入信息,生成链表的函数//
  {
    head=NULL;
    struct person *p,*q;
    int flag=1,n=0;
    while(flag==1)
    {  p=(struct person *)malloc(LEN);
       n++;
       printf("请输入成员编号:");
       scanf("%s",p->num);
       printf("请输入成员姓名:");
       scanf("%s",p->name);
       printf("请输入成员年龄:");
       scanf("%s",p->age);
       printf("请输入成员电话:");
       scanf("%s",p->tele);
       printf("请输入成员地址:");
       scanf("%s",p->addr);
       printf("请输入成员邮箱:");
       scanf("%s",p->email);
          if(n==1)
          q=head=p;
          else
          {q->next=p;
          q=p;}
     printf("继续录入输入1,否则输入0:");
    scanf("%d",&flag);
    }
   return(head);
  }

   
void print(struct person *t) //以表格方式打印链表的函数//
  {
     
       printf("|—————————————————通讯录—————————————————|\n");
       printf("|  编号  |   姓名   | 年龄 |   电话   |       地址      |      邮箱      |\n");  
     do
       {printf(" %8s %10s %6s %10s %17s %16s",t->num, t->name, t->age, t->tele,
   t->addr, t->email);
       t=t->next;
       }while(t!=NULL);
       printf("|—————————————————————————————————————|\n");

  }

 
  struct person *insert(struct person * t) //增加记录的函数//
{
   struct person *p,*a;
     a=(struct person*)malloc(sizeof(struct person));
     printf("请输入成员编号:");
     scanf("%s",a->num);
     printf("请输入成员姓名:");
     scanf("%s",a->name);
     printf("请输入成员年龄:");
     scanf("%s",a->age);
     printf("请输入成员电话:");
     scanf("%s",a->tele);
     printf("请输入成员地址:");
     scanf("%s",a->addr);
     printf("请输入成员邮箱:");
     scanf("%s",a->email);
  if(t==NULL)//若链表为空,则建立一个结点的链表//
  {t=a;
   p=a;
   p->next=NULL;
  }
  else//链表不为空
  { p=t;
    while(p->next!=NULL)p=p->next;//查找链表最后一个结点//
        a->next=NULL;   
        p->next=a; // a的next不指向任何地址,而p的next指向a,使a成为链表最后一个结点//
     }
     return t;
 }


  struct person * delect(struct person *t) // 删除记录 //
{   int m=0;
    char name[10];
    struct person *p=t,*q;
    printf("请输入需要删除的姓名:");
    scanf("%s",name);
    for(;p!=NULL;q=p,p=p->next)
      if(strcmp(p->name,name)==0)  //比较两个字符串的大小,相同则将跳出循环//
      {   m++;
          break;
      }
    if(p==t)
     t=t->next;
    else
    {
      q->next =p->next ;
      free(p);
    }
    if(m==0)
       printf("对不起,删除失败.\n");
    else
       printf("删除成功!\n");
  return t;
}

  
  void nameseek(struct person *t) // 按人名查找显示记录//
{      int m=0;
       struct person *p=t;
       char name[10];
       printf("请输入需要查找的姓名:");  
       scanf("%s",name);
       for(;p!=NULL;p=p->next)  
       {
           if(strcmp(p->name,name)==0)  //比较两个字符串的大小,相同则将跳出循环//
           {  m++;
              printf("序号\t姓名\t年龄\t电话\t地址\temail\n");
                    printf("%s\t%s\t%d\t%s\t%s\t%s\n",p->num,p->name,p->age,p->tele,p->addr,p->email);
              break;
           }
       }
       if(m==0)
           printf("对不起,您要查找的内容不存在!\n");
}

  
  
  void  teleseek(struct person *t) // 按电话号码查找显示记录//
{      int n=0;
       struct person *p=t;
       char  tele[12];
       printf("请输入需要查找的电话:");
       scanf("%s",tele);
       for(;p!=NULL;p=p->next)
          {   
                  if(strcmp(p->tele,tele)==0)  //比较两个字符串的大小,相同则将跳出循环//
                  { n++;
                    printf("序号\t姓名\t年龄\t电话\t地址\temail\n");
                    printf("%s\t%s\t%d\t%s\t%s\t%s\n",p->num,p->name,p->age,p->tele,p->addr,p->email);
                    break;
                  }
          }
        if(n==0)
           printf("对不起,您要查找的内容不存在!\n");
}


  
  void  modify(struct person *t)// 修改记录//
{   
      struct person *p=t;
      int c,a=0;
      char name[10];
      printf("请输入需要修改的记录的姓名:");
      scanf("%s",name);
      for(;p!=NULL;p=p->next)
       {
           if(!strcmp(p->name,name)) //比较两个字符串的大小,相同则将跳出循环//
                       {  a++;
                          break;
                        }
       }
      if(a==0)
         {printf("要修改的记录不存在.\n");
          return;
         }
       while(1)
       {
         printf("\n8修改序号  9修改姓名  10修改年龄  11修改电话  12修改地址  13修改邮编  14退出修改:\n");
         printf("请选择需要修改的内容:");
         scanf("%d",&c);
         switch(c)
         {  case 8:
               printf("\n请输入修改后的序号:");
               scanf("%s",p->num);
               break;
            case 9:
               printf("\n请输入修改后的姓名:");
               scanf("%s",p->name);
               break;
            case  10:
               printf("\n请输入修改后的年龄:");
               scanf("%s",p->age);
               break;
            case 11:
               printf("\n请输入修改后的电话:");
               scanf("%s",p->tele);
               break;
            case 12:
               printf("\n请输入修改后的地址 :");
               scanf("%s",p->addr);
               break;
            case 13:
                printf("\n请输入修改后的email:");
                scanf("%s",p->email);
                break;
            case 14:
                printf("修改完毕!\n");
                break;

            default:
                break;
         }
       }      
}


void save(struct person *t)// 保存为文件//
{   struct person *p=t;
    FILE *fp;
    if((fp=fopen("contact.dat","wb"))==NULL)
        {printf("无法打开此文件\n");
                 return;
                }

    else
        while(p!=NULL)
            { fwrite(p,sizeof(struct  person),1,fp);
              p=p->next;
            }
   
    printf("文件已保存!\n");
    fclose(fp);
}



void main()  //主功能函数//
{struct person *k=NULL;
int key;
while(1)
{printf("||******************欢迎使用通讯录管理系统*****************||\n");
 printf("||**********************系统功能菜单**********************||\n");
 printf("||———————————————————————————||\n");
 printf("||———————————————————————————||\n");
        printf("\t1.录入信息\t\n");
        printf("|---------------------------|\n");
        printf("\t2.以表格方式排列\t\n");
        printf("|---------------------------|\n");
        printf("\t3.增加记录\t\n");
        printf("|---------------------------|\n");
        printf("\t4.删除记录\t\n");
        printf("|---------------------------|\n");
        printf("\t5.按姓名查找\t\n");
        printf("|---------------------------|\n");
        printf("\t6.按电话查找\t\n");
        printf("|---------------------------|\n");
        printf("\t7.修改记录\t\n");
        printf("|---------------------------|\n");
        printf("\t8.保存文件\t\n");
        printf("|---------------------------|\n");
        printf("\t0.退出\t\n");
        printf("|---------------------------|\n");
        printf("\t请输入服务序号:");
scanf("%d",&key);
            switch(key)
            {  case 1:k=creat();break;
               case 2:print(k);break;
               case 3:k=insert(k);break;
               case 4:k=delect(k);break;
               case 5:nameseek(k);break;
               case 6:teleseek(k);break;
               case 7:modify(k);break;
               case 8:save(k);break;
               case 0:printf("谢谢使用");break;
               default:break;
            }
            
  }
}  
搜索更多相关主题的帖子: person 链表程序 include next c语言 
2012-09-09 10:53
阿鞠尼
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:首尔
等 级:蒙面侠
威 望:5
帖 子:1467
专家分:4442
注 册:2012-5-30
收藏
得分:0 
head=NULL;
    struct person *p,*q;/////////这个地方head也应该是结构体指针
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define  NULL 0///////这一句貌似没有用照着我说的改了编译连接都没有问题   你可以试一下[attach]64664[/attach]
图片附件: 游客没有浏览图片的权限,请 登录注册

喜欢睡觉 却经常熬夜
2012-09-09 12:15
jokerzhou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-9-9
收藏
得分:0 
回复 2楼 阿鞠尼
主要是运行的问题
图片附件: 游客没有浏览图片的权限,请 登录注册

。。。。。。总是运行不了
2012-09-09 12:34
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
  你看看是不是 非法内存操作了    检查下自己的变量是否初始化后 才调用的

有条件的话 弄个GDB 的工具  跟踪下程序的运行

楼下的 我先占的座哟,就不劳烦了,我来解决

[ 本帖最后由 zhu224039 于 2012-9-9 13:59 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-09-09 13:06
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
访问了非法内存  申请空间时候初始化有问题  creat
2012-09-09 13:32
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
你把 形参和实参 变量的作用域  等等知识再复习一遍把  

你细想下       struct person *insert(struct person * t)    这个struct person * t  你在主体函数调用中 传送过去的是不是NULL   空指针  传这个东西过去你想程序怎么运行呢

有保存 数据函数,为什么没有打开文件的函数呢   

  

   


                                            

我要成为嘿嘿的黑客,替天行道
2012-09-09 13:39
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
  你问题大发了

我要成为嘿嘿的黑客,替天行道
2012-09-09 13:39
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
调试不报错 只能说明 程序 在语法上 木有问题 。姐,对几个变量拿来干什么用的 理解还不够透。抄书的把


[ 本帖最后由 zhu224039 于 2012-9-9 13:44 编辑 ]

我要成为嘿嘿的黑客,替天行道
2012-09-09 13:43
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
要不要小弟 帮你把作业给做了

我要成为嘿嘿的黑客,替天行道
2012-09-09 13:48
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
void main()  //主功能函数//
{struct person *k=NULL;
int key;
while(1)
{printf("||******************欢迎使用通讯录管理系统*****************||\n");
printf("||**********************系统功能菜单**********************||\n");
printf("||———————————————————————————||\n");
printf("||———————————————————————————||\n");
        printf("\t1.录入信息\t\n");
        printf("|---------------------------|\n");
        printf("\t2.以表格方式排列\t\n");
        printf("|---------------------------|\n");
        printf("\t3.增加记录\t\n");
        printf("|---------------------------|\n");
        printf("\t4.删除记录\t\n");
        printf("|---------------------------|\n");
        printf("\t5.按姓名查找\t\n");
        printf("|---------------------------|\n");
        printf("\t6.按电话查找\t\n");
        printf("|---------------------------|\n");
        printf("\t7.修改记录\t\n");
        printf("|---------------------------|\n");
        printf("\t8.保存文件\t\n");
        printf("|---------------------------|\n");
        printf("\t0.退出\t\n");
        printf("|---------------------------|\n");
                                                            -----------------> 在这个地方加个循环体把  while(!key)  
        printf("\t请输入服务序号:");
scanf("%d",&key);
            switch(key)
            {  case 1:k=creat();break;
               case 2:print(k);break;
               case 3:k=insert(k);break;
               case 4:k=delect(k);break;       ---------------------------------------------》k 全部换成head
               case 5:nameseek(k);break;
               case 6:teleseek(k);break;
               case 7:modify(k);break;
               case 8:save(k);break;              
               case 0:printf("谢谢使用");break;
               default:break;                       ----------------------------------------------》这个地方  做个重新输入的 标志把,别人如果 输入 个100什么  你怎么告诉别人 输入错误呢                                 
            }
            ----------------------------------------------------------------》 循环结束体  范围到这
  }
}   

我要成为嘿嘿的黑客,替天行道
2012-09-09 14:07
快速回复:新手求教c语言链表程序!编译通过但是运行不出来!谢谢啦
数据加载中...
 
   



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

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