2 sinat 27769063 sinat_27769063 于 2015.06.11 10:39 提问

C++用指针实现读取,load()方法一直不行,麻烦看下
c++

C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下C++用指针实现读取,load()方法一直不行,麻烦看下

3个回答

sinat_27769063
sinat_27769063   2015.06.11 10:41

// 通讯录管理系统,主要用动态链表实现

include //I/O函数

include //字符串函数,提供字符串处理的原函数

include //标准库函数,提供malloc,system,exit等函数

define N 50 //定义常数表示记录数

typedef struct contact//定义数据结构
{
char name[10]; //姓名
char age[3]; //年龄
char tele[11]; //电话号码
char postcode[6]; //邮编号码
char addr[50]; //单位地址
char email[30]; //邮箱
struct contact * pnext;
}contact, *pcontact;

//函数的声明
int menu(); //主菜单函数
pcontact creat();

bool insert (pcontact phead, int pos); //创建并添加联系人
void traverse(pcontact phead); // 显示联系人
int length(pcontact phead); //保存记录长度
void sort(pcontact phead); //按姓名拼音首字母排序联系人
void search(pcontact phead); //查找联系人
void updata(pcontact phead); //修改联系人
void delete_name(pcontact phead); //删除联系人
void delete_list(pcontact phead, int pos);

void save(pcontact phead); //存储联系人
void load(pcontact phead); //从文件中读联系人
int exit(); //退出系统

//主函数
int main()
{
pcontact phead = NULL;
system ("cls"); // 清屏,需要头文件stdlib.h
phead = creat();
while (1)
{
int i = 0;
switch (menu())
{
case 0: insert (phead, ++i); break;
case 1: updata (phead); break;
case 2: delete_name (phead); break;
case 3: search(phead); break;
case 4: save (phead); break;
case 5: load (phead); break;
case 6: exit (0); break;
default: printf ("请输入数字0到6:\n");
}
printf ("\t\t\t请按enter键返回主菜单\n");
getchar ();
system ("CLS");
}
return 0;
}

//主菜单函数,函数返回值为整数,代表所选的菜单项
int menu()
{
char s[20];
int num;
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("-----------------------------------主菜单-------------------------------------\n\n");
printf ("\t\t\t\t0.添加信息\n");
printf ("\t\t\t\t1.修改信息\n");
printf ("\t\t\t\t2.删除信息\n");
printf ("\t\t\t\t3.查找信息\n");
printf ("\t\t\t\t4.存储信息\n");
printf ("\t\t\t\t5.读入信息\n");
printf ("\t\t\t\t6.退出系统\n");
printf ("\n**********************************感谢使用************************************\n");
do
{
printf ("请输入您的选项(0-6):");
gets (s);
num = atoi(s); //将字符串转换成一个整型数值
}while (num < 0 || num > 6);
return num;
}

//创建一个动态空链表
pcontact creat()
{
//分配一个不存放有效数据的头结点
pcontact phead = (pcontact)malloc( sizeof(contact) );
if (NULL == phead)
{
exit (-1); //分配内存失败,终止程序
}
phead->pnext = NULL;
return phead;
}

//创建并添加联系人信息
//在phead所指向链表的第pos个节点的前面插入一个新的结点
bool insert (pcontact phead, int pos)
{
int i = 0;
pcontact p = phead;
while(NULL != p && i < pos-1)
{
p = p->pnext;
++i;
}
if (i > pos-1 || NULL == p)
return false;
//如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓
//分配新的结点
pcontact pnew = (pcontact)malloc(sizeof(contact));
if (NULL == pnew)
{

exit(-1);//动态分配内存失败
}
system ("CLS");
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("------------------------此目录下可创建并添加联系人信息------------------------\n\n");
printf ("请输入联系人姓名:");
gets (pnew->name);
printf ("请输入联系人年龄:");
gets (pnew->age);
printf("请输入联系人电话号码:");
gets (pnew->tele);
printf("请输入联系人邮编号码:");
gets (pnew->postcode);
printf ("请输入联系人单位地址:");
gets (pnew->addr);
printf ("请输入联系人邮箱:");
gets (pnew->email);
printf ("添加联系人信息成功!");
printf ("\n**********************************感谢使用************************************\n");
//将新的结点存入p节点的后面
pcontact q = p->pnext;
p->pnext = pnew;
pnew->pnext = q;
return true;
}
//修改信息
void updata(pcontact phead)
{
char name[10];
sort(phead);
int len = length(phead);
pcontact p=phead->pnext;
int i;
system ("CLS");
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("--------------------------此目录下可修改联系人信息----------------------------\n\n");
printf("请输入您要修改的联系人姓名:\n");
gets(name);
printf("此联系人的所有信息如下:\n");
printf ("联系人年龄:%s\n", p->age);
printf ("联系人电话号码:%s\n", p->tele);
printf ("联系人邮编号码:%s\n", p->postcode);
printf ("联系人单位地址:%s\n", p->addr);
printf ("联系人邮箱:%s\n", p->email);
if (NULL != p)
{
for (i = 0; i < len; ++i, p = p->pnext)
{
printf("\n请输入您要修改的联系人信息\n");
printf("姓名:");
scanf("%s",&p->name);
printf("年龄:");
scanf("%s",&p->age);
printf("电话号码:");
scanf("%s",&p->tele);
printf("邮编号码:");
scanf("%s",&p->postcode);
printf("单位地址:");
scanf("%s",&p->addr);
printf("邮箱:");
scanf("%s",&p->email);
printf("此联系人信息修改成功!\n");
printf ("\n**********************************感谢使用************************************\n");
if (i + 1 < len)
{
system ("pause");
}
}
}
else
{
printf ("对不起,通讯录系统没有此联系人信息!\n\n");
printf ("\n**********************************感谢使用************************************\n");
}
return;
}
//显示联系人信息
//遍历通讯录的信息,先排序,再输出
void traverse(pcontact phead)
{

sort(phead);
int len = length(phead);
pcontact p = phead->pnext;
int i;
system ("CLS");
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("----------------------------------联系人信息表--------------------------------\n\n");
if (NULL != p)
{
for (i = 0; i < len; ++i, p = p->pnext)
{
printf ("联系人姓名:%s\n", p->name);
printf ("联系人年龄:%s\n", p->age);
printf ("联系人电话号码:%s\n", p->tele);
printf ("联系人邮编号码:%s\n", p->postcode);
printf ("联系人单位地址:%s\n", p->addr);
printf ("联系人邮箱:%s\n", p->email);
printf ("\n**********************************感谢使用************************************\n");
if (i + 1 < len)
{
system ("pause");
}
}
}
else
{
printf ("对不起,通讯录系统没有任何联系人信息!\n\n");
printf ("\n**********************************感谢使用************************************\n");
}
return;
}
//有效结点的个数
int length(pcontact phead)
{
pcontact p = phead->pnext;
int len = 0;
while (NULL != p)
{
++len;
p = p->pnext;
}
return len;
}
//对通讯录进行排序,按姓名的拼音首字母顺序
void sort(pcontact phead)
{
int i, j;
int len = length(phead);
char name[10];

char age[3];
char tele[11];
char postcode[6];

char email[30];
char addr[50];
pcontact p, q;
//冒泡排序
for (i = 0, p = phead->pnext; i < len - 1; ++i, p = p->pnext)
for (j = i + 1, q = p->pnext; j < len; ++j, q = q->pnext)
if (strcmp (p->name, q->name) > 0)
{
//交换姓名
strcpy (name, p->name);
strcpy (p->name, q->name);
strcpy (q->name, name);
//交换年龄
strcpy (age, p->age);
strcpy (p->age, q->age);
strcpy (q->age, age);
//交换电话号码
strcpy (tele, p->tele);
strcpy (p->tele, q->tele);
strcpy (q->tele, tele);
//交换邮编号码
strcpy (postcode, p->postcode);
strcpy (p->postcode, q->postcode);
strcpy (q->postcode, postcode);
//交换单位地址
strcpy (addr, p->addr);
strcpy (p->addr, q->addr);
strcpy (q->addr, addr);
//交换邮箱
strcpy (email, p->email);
strcpy (p->email, q->email);
strcpy (q->email, email);
}
return;
}

//查询联系人信息
void search(pcontact phead)
{
pcontact p = phead->pnext;
char name[20];
int len = length (phead); //记录容量的最大值
int i;
int mark = 0;
int a = 0;
system ("CLS");
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("----------------------------联系人信息查询功能操作----------------------------\n\n");
printf ("请输入您要查找的联系人姓名:");
gets (name);
if (NULL != p)
{
for (i = a; i < len; ++i, p = p->pnext)
{
if (strcmp (name, p->name) == 0)
{
printf ("\n\t\t\t以下是您查找的联系人信息\n");
printf ("联系人姓名:%s\n", p->name);
printf ("联系人年龄:%s\n", p->age);
printf ("联系人电话号码:%s\n", p->tele);
printf ("联系人邮编号码:%s\n", p->postcode);
printf ("联系人单位地址:%s\n", p->addr);
printf ("联系人邮箱:%s\n", p->email);
printf ("\n**********************************感谢使用************************************\n");
++mark;
if (i + 1 < len)
{
system ("pause");
}
}
}
if (0 == mark)
{
printf ("对不起,通讯录系统没有此联系人信息!\n\n");
printf ("\n**********************************感谢使用************************************\n");
}
}
else
{
printf ("对不起,通讯录系统没有任何联系人信息!\n\n");
printf ("\n**********************************感谢使用************************************\n");
}

return;

}

//删除联系人信息
void delete_name(pcontact phead)
{
int i, pos;
int mark = 0;
int val;
int len = length (phead);
char name[20];
pcontact p = phead->pnext;
system ("CLS");
printf("*************************欢迎进入X-X-X通讯录管理系统*************************\n");
printf("-----------------------------联系人信息删除功能操作---------------------------\n\n");
printf ("请输入您要删除的联系人姓名:");
gets (name);
if (NULL != p)
{
for (i = 1; i <= len; ++i, p = p->pnext)
{
if (strcmp (name, p->name) == 0)
{
printf ("\n\t\t\t以下是您要删除的联系人信息\n");
printf ("num:%d\n", mark+1);
printf ("联系人姓名:%s\n", p->name);
printf ("联系人年龄:%s\n", p->age);
printf ("联系人电话号码:%s\n", p->tele);

printf ("联系人邮编号码:%s\n", p->postcode);
printf ("联系人单位地址:%s\n", p->addr);
printf ("联系人邮箱:%s\n", p->email);
printf ("\n**********************************感谢使用************************************\n");
pos = i;
++mark;
}

    }
    if (1 == mark )
    {
        printf ("\n\t\t是否确定删除此联系人信息?(y/n)");
        if (getchar () =='y' || getchar () =='Y')
        {
            delete_list(phead, pos); 
            printf ("\n\t\t删除联系人信息成功!\n");
            system ("pause"); 
        }
        else 
        { 
            printf (""); 
            getchar (); 
            return; 
        } 
    }
    else if (mark > 1)
    {
        printf ("这里有%d个相同的联系人!\n", mark);
        printf ("您想删除第几个联系人的信息?\n");
        printf ("num:");
        scanf ("%d", &val);
        pos = pos - mark + val;
        delete_list(phead, pos); 
        printf ("\n\t\t此联系人信息删除成功!\n");
        system ("pause"); 
    }
    else
    {
        printf ("对不起,通讯录系统没有此联系人信息!\n\n");
        printf ("\n**********************************感谢使用************************************\n");
    }
}
else
{
    printf ("对不起,通讯录系统没有任何联系人信息!\n\n");
    printf ("\n**********************************感谢使用************************************\n");
}

return;

}
//删除在phead所指向链表的第pos个结点
void delete_list (pcontact phead, int pos)
{
int i = 0;
pcontact p = phead;
if (NULL == p->pnext)
{
printf ("对不起,通讯录系统没有任何联系人信息!\n");
printf ("\n**********************************感谢使用************************************\n");
return;
}
while (NULL != p->pnext && i < pos - 1)
{
p = p->pnext;
++i;
}
//如果程序能执行到这一行说明p已经指向了第pos个结点,并且第pos个结点是存在的
pcontact q = p->pnext; //q指向待删除的结点
p->pnext = p->pnext->pnext; //删除p节点后面的结点
free (q); //释放q所指向的节点所占的内存
q = NULL;
return;
}
//通讯录的记录存盘操作,使用文件指针;
void save(pcontact phead)
{
FILE * fp;
pcontact p =phead->pnext;
fp = fopen ("contact.txt", "w");
fprintf(fp,"***************所有联系人信息表***************\n\n");
while (NULL != p)
{
fprintf(fp,"===============================================\n");
fprintf (fp, "\t\t姓名:%s\n", p->name);
fprintf (fp, "\t\t年龄:%s\n", p->age);
fprintf (fp, "\t\t电话号码:%s\n", p->tele);
fprintf (fp, "\t\t邮编号码:%s\n", p->postcode);
fprintf (fp, "\t\t单位地址:%s\n", p->addr);
fprintf (fp, "\t\t邮箱:%s\n\n", p->email);
p = p->pnext;
}
fprintf(fp,"===============================================\n");
fprintf (fp, "********来自X-X-X通讯录系统,欢迎使用!*******\n");
fclose (fp);
printf ("\n\t\t联系人信息存储成功,存储在contact.txt文档中!\n");
return;
}
void load(pcontact phead)//读入联系人信息
{
int i,n;
FILE *fp; //指向文件的指针
pcontact p =phead->pnext;
if((fp=fopen("contact.txt","rb"))==NULL)
{
printf("对不起,打开文件失败!\n");
exit(1);
}
fscanf(fp,"%d",&n);
for(i=0;i fscanf(fp,"%s%s%s%s%s%s%s",p->name,p->age,p->tele,p->postcode,p->addr,p->email); //按格式读入记录
fclose(fp);
printf("您已成功读入contact.txt文档中联系人信息!\n");
return ;
}

monaso
monaso   2015.06.11 11:16

for循环是不是有问题????还是粘贴的时候没有粘贴全???

yangbo50304
yangbo50304   2015.06.11 14:43

你代码好长,把load方法中for(i=0;i fscanf(fp,"%s%s%s%s%s%s%s",p->name,p->age,p->tele,p->postcode,p->addr,p->email); //按格式读入记录这一行修改成下面的

for(i=0;i < n;i++)
        fscanf(fp,"%s%s%s%s%s%s%s",p->name,p->age,p->tele,p->postcode,p->addr,p->email); //按格式读入记录
Csdn user default icon
上传中...
上传图片
插入图片