C语言储存、读取、修改功能 问题出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”

Abe_ 2012-06-06 10:07:04
我是新手,所以写得比较差。
一下这个程序可以运行,但是储存 读取 修改时 打印出现“屯屯屯屯屯屯屯屯屯屯屯屯屯”

太无奈了,请帮我看看。谢谢


#include"global.h"



//-------函数实现--------------------------
Link Create(Link Head)
{//创建一个带头节点的空链表。
Head=(Link)malloc(sizeof(Node));
if(!Head)
{
printf("分配内存失败!");
return 0;
}

Head->Next=NULL;
return Head;
}

void Release(Link Head)
{//释放链表。
Link ptr;//声明一个操作用的指针
while(Head!=NULL)
{
ptr=Head;
Head=Head->Next;
free(ptr);//释放借点资源
}
}

Link Add(Link Head)
{//前插法添加数据。
Link pNew;//声明一个新节点。
char again;
char code[10],name[30],sex,edubg[30],post[30],department[30],address[50],phone[20];
int year,wyear;
int wage;
do
{
pNew=(Link)malloc(sizeof(Node));
//数据域
printf("请输入职工工号:\n");
scanf("%s",code);
printf("请输入职工姓名:\n");
scanf("%s",name);
printf("请输入职工性别(M/F):\n");
getchar();
scanf("%c",&sex);
printf("请输入职工的出生年份(1900-2000):\n");
scanf("%d",&year);
while(year<1900||year>2000)
{
printf("请输入正确的年份。");
scanf("%d",&year);
}
printf("请输入职工的工作年份(1900-2012):\n");
scanf("%d",&wyear);
while(wyear<1900||wyear>2012)
{
printf("请输入正确的年份。");
scanf("%d",&wyear);
}
printf("请输入职工的学历:\n");
scanf("%s",edubg);
printf("请输入职工的职称:\n");
scanf("%s",post);
printf("请输入职工所在部门:\n");
scanf("%s",department);
printf("请输入职工的住址:\n");
scanf("%s",address);
printf("请输入职工的联系电话:\n");
scanf("%s",phone);
printf("请输入职工的月薪(小于60000):\n");
scanf("%d",&wage);
while(wage>60000)
{
printf("请输入正确的月薪数据。");
scanf("%d",&wage);
}
strcpy(pNew->m_Code,code);
pNew->m_Code[strlen(code)+1]='\0';
strcpy(pNew->m_Name,name);
pNew->m_Name[strlen(name)+1]='\0';
pNew->m_Sex=sex;
pNew->m_Year=year;
pNew->m_WYear=wyear;
strcpy(pNew->m_EduBG,edubg);
pNew->m_EduBG[strlen(edubg)+1]='\0';
strcpy(pNew->m_Post,post);
pNew->m_Post[strlen(post)+1]='\0';
strcpy(pNew->m_Department,department);
pNew->m_Department[strlen(department)+1]='\0';
strcpy(pNew->m_Address,address);
pNew->m_Address[strlen(address)+1]='\0';
strcpy(pNew->m_Phone,phone);
pNew->m_Phone[strlen(phone)+1]='\0';
pNew->m_Wage=wage;

//指针域
pNew->Next=Head->Next;
Head->Next=pNew;
printf("数据添加成功!是否继续添加?(Y/N):");


again=getchar();
again=toupper(again);
while(again!='Y'&&again!='N')
{
again=getchar();
again=toupper(again);
}
}while(again=='Y');
return Head;
}



bool Search(Link Head)
{//查询同时满足“姓名”和“部门”的职工信息。
Link ptr;
char department[30];
char name[30];
int flag=0;
int pp=0;
ptr=Head->Next;
printf("请输入部门:");
scanf("%s",department);
printf("请输入姓名:");
scanf("%s",name);
printf("\n\n\n----------------查询结果------------------\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃");
while(ptr)
{
pp=(strcmp(ptr->m_Name,name)&&strcmp(ptr->m_Department,department));
if(!pp)
{
Display_Node(ptr);
flag=1;
}
ptr=ptr->Next;//查询下一个节点
}
if(flag==1)
{
printf("\n----------------查找完毕------------------\n");
system("PAUSE");
return true;
}
else
{
printf("无此职工的信息!\n");
system("PAUSE");
return false;

}
}

Link Search_Unique_Front(Link Head)
{//查询满足“职工代码“的职工信息(职工代码必需唯一)。
Link ptr;
char code[10];
int flag1=0;
ptr=Head;
printf("请输入职工工号:");
scanf("%s",code);

while(ptr->Next)
{
if((strcmp(ptr->Next->m_Code,code)))
{
if(flag1=0)
{
printf("\n----------------查询结果------------------\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃\n\n\n\n");
flag1=1;
}
Display_Node(ptr);//打印满足条件的节点
return ptr; //注意,是返回的查询到的节点的直接前趋节点。
} //此处有疑问?!?!?!?!?!?!?!
ptr->Next=ptr->Next->Next;//查询下一个节点

}
return ptr;

}



void Display_List(Link Head)
{
Link ptr;
ptr=Head->Next;
system("CLS");
printf("=============================================所有职工信息=====================================================\n");
printf("\n 工号 ┃ 姓名 ┃性别┃出生年份┃工作年份┃ 学历 ┃ 职称 ┃ 部门 ┃ 住址 ┃ 电话 ┃ 月薪 ┃");
while(ptr)
{
Display_Node(ptr);
ptr=ptr->Next;
}
system("PAUSE");
}


void Display_Node(Link pNode)

{//在标准输出设备上输出。
printf("\n%8s┃%8s┃%4c┃%8d┃%8d┃%8s┃%8s┃%8s┃%10s┃%11s┃%6d┃\n",pNode->m_Code,pNode->m_Name,pNode->m_Sex,pNode->m_Year,pNode->m_WYear,pNode->m_EduBG,pNode->m_Post,pNode->m_Department,pNode->m_Address,pNode->m_Phone,pNode->m_Wage);

}


Link Modify(Link Head)
{// 修改单一个节点。
Link ptr;
ptr=Search_Unique_Front(Head);
char code[10],name[30],sex,edubg[30],post[30],department[30],address[50],phone[20];
int year,wyear;
int wage;
if(ptr->Next)
{
printf("请输入职工工号:\n");
scanf("%s",code);
printf("请输入职工姓名:\n");
scanf("%s",name);
printf("请输入职工性别(M/F):\n");
getchar();
scanf("%c",&sex);
printf("请输入职工的出生年份(1900-2000):\n");
scanf("%d",&year);
while(year<1900||year>2000)
{
printf("请输入正确的年份。");
scanf("%d",&year);
}
printf("请输入职工的工作年份(1900-2012):\n");
scanf("%d",&wyear);
while(wyear<1900||wyear>2012)
{
printf("请输入正确的年份。");
scanf("%d",&wyear);
}
printf("请输入职工的学历:\n");
scanf("%s",edubg);
printf("请输入职工的职称:\n");
scanf("%s",post);
printf("请输入职工所在部门:\n");
scanf("%s",department);
printf("请输入职工的住址:\n");
scanf("%s",address);
printf("请输入职工的联系电话:\n");
scanf("%s",phone);
printf("请输入职工的月薪(小于60000):\n");
scanf("%d",&wage);
while(wage>60000)
{
printf("请输入正确的月薪数据。");
scanf("%d",&wage);
}
strcpy(ptr->Next->m_Code,code);//因ptr是前趋节点,所以要用ptr->Next;
ptr->Next->m_Code[strlen(code)+1]='\0';
strcpy(ptr->Next->m_Name,name);
ptr->Next->m_Name[strlen(name)+1]='\0';
ptr->Next->m_Sex=sex;
ptr->Next->m_Year=year;
ptr->Next->m_WYear=wyear;
strcpy(ptr->Next->m_EduBG,edubg);
ptr->Next->m_EduBG[strlen(edubg)+1]='\0';
strcpy(ptr->Next->m_Post,post);
ptr->Next->m_Post[strlen(post)+1]='\0';
strcpy(ptr->Next->m_Department,department);
ptr->Next->m_Department[strlen(department)+1]='\0';
strcpy(ptr->Next->m_Address,address);
ptr->Next->m_Address[strlen(address)+1]='\0';
strcpy(ptr->Next->m_Phone,phone);
ptr->Next->m_Phone[strlen(phone)+1]='\0';
ptr->Next->m_Wage=wage;
printf("\n修改成功!\n");

}
else
printf("没有找到此职工的记录,无法修改!\n");
system("PAUSE");
return Head;

}




Link Del(Link Head)
{
Link ptr;
Link ptr_front;
ptr_front=Search_Unique_Front(Head);
ptr=ptr_front->Next;
if(ptr)
{
ptr_front->Next =ptr->Next;
free (ptr);
printf("\n修改成功!\n");
}
else
printf("没有找到此职工的记录,无法删除!\n");
system("PAUSE");
return Head;
}


void Save_ByFile(Link Head,FILE *fp)
{
Link pNode;
pNode=Head->Next;
fflush(fp);
while(pNode)
{
fwrite(pNode,sizeof(Node),1,fp);
pNode=pNode->Next;
}
printf("数据文件保存成功!\n");
system("PAUSE");

}


Link Sort(Link Head)
{//我创建的是带头节点的链表。用直接插入法。
if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
printf("书籍节点少于两个,不用排序!\n");
system("PAUSE");
return Head;
}
//第二步;
Link ptr,ptr_F,ptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表
//第三步
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位;
while(ptr_F->Next)
{
if(ptr->m_Wage>ptr_F->Next->m_Wage)//排序条件~~~~!!!!!
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}

}//while(ptr->Next)
if(ptr_F->Next=NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示查到有序链表的最后面了
}
ptr=ptr_N;//归位,准备下一次排序
}//while(ptr)
printf("从高到低,排序成功!");
}
Link load(Link Head,FILE *fp)
{
Link pNode;
pNode=Head;

while(!feof(fp))
{
pNode=(Link)malloc(sizeof(Node));
fread(pNode,sizeof(Node),1,fp);
printf("\n%8s┃%8s┃%4c┃%8d┃%8d┃%8s┃%8s┃%8s┃%10s┃%11s┃%6d┃\n",pNode->m_Code,pNode->m_Name,pNode->m_Sex,pNode->m_Year,pNode->m_WYear,pNode->m_EduBG,pNode->m_Post,pNode->m_Department,pNode->m_Address,pNode->m_Phone,pNode->m_Wage);
pNode=pNode->Next;
}
printf("文件载入成功!\n");

system("PAUSE");
return Head;



}


int main()
{
FILE *fp;
Link Head=0;
Head=Create(Head);
fp=fopen("aa.txt","r+");
if(!fp)
{
printf("打开文件失败");
return 1;
}
Head=load(Head,fp);
int menu;
while(1)
{
system("cls");
printf("*****************************************************\n");
printf("*====================菜单选顶=======================*\n");
printf("*===================================================*\n");
printf("* 1.注册职工 2.修改信息 3.删除信息 4.信息查询 *\n");
printf("* 5.保存文件 6.工资排行 7.信息显示 0.退出系统 *\n");
printf("*****************************************************\n");
printf("请选择相应操作菜单项:");
scanf("%d",&menu);
while(menu>7||menu<0)
{
printf("请选择正确的菜单选项:");
scanf("%d",&menu);
}
switch(menu)
{
case 0:
{printf("成功退出系统!");fclose(fp);}
return 0;
case 1:
Head=Add(Head);
break;
case 2:
Head=Modify(Head);
break;
case 3:
Head=Del(Head);
break;
case 4:
Search(Head);
break;
case 5:
Save_ByFile(Head,fp);
break;
case 6:
Sort(Head);
break;
case 7:
Display_List(Head);
break;
default:
printf("请选择正确的菜单项进行操作。多谢合作!");
}
}
Release(Head);
fclose(fp);
return 0;
}
...全文
820 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Abe_ 2012-06-07
  • 打赏
  • 举报
回复
嗯,是为初始化造成的。谢谢各位了。
赵4老师 2012-06-07
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
ttt1985 2012-06-07
  • 打赏
  • 举报
回复
想起了我一开始用VC 的时候
kinuxroot 2012-06-07
  • 打赏
  • 举报
回复
是VC吧……明显的变量未初始化,“屯屯”是VC为了方便调试对未初始化的默认填充,这样你就能知道有变量未初始化了。记住定义变量一定要初始化,初始化数组最好全清零……
Abe_ 2012-06-07
  • 打赏
  • 举报
回复
额,谢谢,我继续调试看看。
[Quote=引用 7 楼 的回复:]

哥们,程序员要学会调试,不然会死的很惨的,至于怎么调试,Google,至于是什么问题,大家都说的差不多了。
引用 6 楼 的回复:

然后呢
引用 5 楼 的回复:

我的第一感觉跟你一样。
引用 3 楼 的回复:

典型的字符数组木有初始化的现象。
[/Quote]
soarfish 2012-06-06
  • 打赏
  • 举报
回复
数组没有初始化或者数组越界
猪头小哥 2012-06-06
  • 打赏
  • 举报
回复
哥们,程序员要学会调试,不然会死的很惨的,至于怎么调试,Google,至于是什么问题,大家都说的差不多了。
[Quote=引用 6 楼 的回复:]

然后呢
引用 5 楼 的回复:

我的第一感觉跟你一样。
引用 3 楼 的回复:

典型的字符数组木有初始化的现象。
[/Quote]
Abe_ 2012-06-06
  • 打赏
  • 举报
回复
然后呢
[Quote=引用 5 楼 的回复:]

我的第一感觉跟你一样。
引用 3 楼 的回复:

典型的字符数组木有初始化的现象。
[/Quote]
猪头小哥 2012-06-06
  • 打赏
  • 举报
回复
我的第一感觉跟你一样。
[Quote=引用 3 楼 的回复:]

典型的字符数组木有初始化的现象。
[/Quote]
tongzhipeng5699 2012-06-06
  • 打赏
  • 举报
回复
关于 烫 和 屯的问题多半没有将内存清零造成的
pNew=(Link)malloc(sizeof(Node));
memset(pNew,0,sizeof(Node));//将内存清下零
这样试试,如果不行在每个malloc的地方都清下试试
需要包含关文件 string.h
pathuang68 2012-06-06
  • 打赏
  • 举报
回复
典型的字符数组木有初始化的现象。
lbq199204 2012-06-06
  • 打赏
  • 举报
回复
没见代码。
Abe_ 2012-06-06
  • 打赏
  • 举报
回复


#include "stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
#include"ctype.h"

struct Employee
{
//声明职工的结构作为链表节点。
//-----数据域-----
char m_Code[10]; //工号
char m_Name[30]; //字名
char m_Sex; //性别
int m_Year; //出生年份
int m_WYear; //工作年份
char m_EduBG[30]; //学历
char m_Post[30]; //职称
char m_Department[30]; //部门
char m_Address[50]; //地址
char m_Phone[20]; //电话
int m_Wage; //工资
//链表节点的指针域---
struct Employee* Next;
};

//取别名
typedef struct Employee Node;
typedef Node* Link;

//函数声明
Link Create(Link Head);
void Release(Link Head);
Link Add(Link Head);
bool Search(Link Head);
Link Search_Unique(Link Head);
void Display_List(Link Head);
void Display_Node(Link pNode);
Link Modify(Link Head);
Link Del(Link Head);
void Save_ByFile(Link Head,FILE* fp);
Link Sort(Link Head);
Link load(Link Head,FILE* fp);

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧