# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
struct dnode{
char dlname[20],
dfname[20],
dtel[15];
struct dnode *dnext;
};
int dmenu(); //main menu
void dadd(); //add to list
void dfind(); //search from the list
void dedit(); //edit the record
void ddel(); //delete from the list
void ddisp(); //display all
dnode* sort(dnode* head_node);
typedef struct dnode node;
node *dstart, *dtemp;
int dmenu()
{
int dch;
int i,j,n;
printf(" TELEPHONE DIRECTORY ");
printf(" =================== ");
printf(" \n1. Add ");
printf(" \n2. Find ");
printf(" \n3. Sort ");
printf(" \n4. Delete ");
printf(" \n5. Display All ");
printf(" \n6. EXIT ");
printf(" \nEnter your choice(1-6):");
scanf("%d", &dch);
return dch;
}
void dadd()
{
FILE *fp;
fp=fopen("record.txt","a");
node *dptr,*dprev;
dtemp=(node *)malloc(sizeof(node));
printf("First name: ");
scanf("%s", dtemp->dfname);
printf("Last name:");
scanf("%s", dtemp->dlname);
printf("Telephone No.: ");
scanf("%s", dtemp->dtel);
dtemp->dnext=NULL;
if(dstart==NULL) dstart=dtemp;
else {
dprev=dptr=dstart;
while(strcmp(dtemp->dfname,dptr->dfname)>0){
dprev=dptr;
dptr= dptr->dnext;
if (dptr == NULL) break;
}
if(dptr==dprev) {
dtemp->dnext=dstart;
dstart=dtemp;
}
else if(dptr==NULL)
dprev->dnext=dtemp;
else {
dtemp->dnext=dptr;
dprev->dnext=dtemp;
}
}
fprintf(fp,"%20s %20s %s\n",dtemp->dfname,dtemp->dlname,dtemp->dtel);
fclose(fp);
}
void dfind()
{
FILE *fp;
node *dptr;
char dstr[20];
fp=fopen("record.txt","r");
if(dstart==NULL){
printf("\n\t\t\tTelephone Directory is Empty....\n");
getch();
return;
}
printf("First Name to Find : ");
scanf("%s",dstr);
dptr=dstart;
while(strcmp(dptr->dfname,dstr)!=0)
{
dptr= dptr->dnext;
if (dptr == NULL) break;
}
if(dptr!=NULL) {
printf("First Name : %s\n",dptr->dfname);
printf("Last Name : %s\n",dptr->dlname);
printf("Phone Number : %s\n",dptr->dtel);
}
else {
printf("No Matching Records Found .......\n");
}
fclose(fp);
getch();
}
这是我的排序功能,如何在文件中对记录进行排序?
dnode* sort(dnode* head_node)
{
dnode *prev, *curr = head_node;
int i, list_size = 0;
/* Determine the size first */
while (curr != NULL)
{
list_size++;
curr = curr->dnext;
}
/* sorting */
for (i = 1; i < list_size; i++)
{
curr = head_node;
while (curr->dnext != NULL)
{
if (strcmp(curr->dfname, curr->dnext->dfname) > 0)
{
dnode* next_node = curr->dnext;
curr->dnext = next_node->dnext;
next_node->dnext = curr;
if (curr == head_node)
head_node = next_node;
else
prev->dnext = next_node;
curr = next_node;
}
prev= curr;
curr = curr->dnext;
}
}
return head_node;
}
这是我的删除功能,任何人都可以帮我解决文件中的删除记录吗?
void ddel()
{
node *dptr,*dprev,*dtemp;
char dstr[20],dyn='n';
struct dnode record;
if(dstart==NULL) {
printf("\n\t\t\tTelephone Directory is Empty....\n");
getch();
return;
}
printf("First Name to Delete : ");
scanf("%s",&dstr);
dprev=dptr=dstart;
while (strcmp(dptr->dfname,dstr)!=0)
{
dprev=dptr;
dptr= dptr->dnext;
if (dptr == NULL)
break;
}
if(dptr!=NULL){
printf("\nDeleting Record.....Confirm [y/n]: ");
dyn=getch();
printf("\n\n---------------------------------------------------------");
printf("\nFirst Name : %s\n",dptr->dfname);
printf("Last Name : %s\n",dptr->dlname);
printf("Phone Number : %s\n",dptr->dtel);
printf("---------------------------------------------------------");
if(dyn=='y') {
if (dptr==dstart) {
dtemp=dstart->dnext;
free(dstart);
dstart=dtemp;
}
else {
dtemp=dptr->dnext;
free(dptr);
dprev->dnext=dtemp;
}
printf("\n\n1 Record Deleted....");
}
else
printf("\n\nRecord not Deleted....");
}
else {
printf("\nNo Matching Records Found .......");
}
getch();
}
void ddisp()
{
FILE *fp;
struct dnode rec;
fp=fopen("record.txt","r");
node *dptr;
if(dstart==NULL) {
printf("\n\t\t\tTelephone Directory is Empty....\n");
getch();
return;
}
printf("\t\t------------------------------\n");
for(dptr=dstart; dptr!=NULL; dptr=dptr->dnext) {
printf("\t\tFirst name: %s", dptr->dfname);
printf("\n\t\tLast name:%s", dptr->dlname);
printf("\n\t\tTelephone No.: %s", dptr->dtel);
printf("\n\t\t------------------------------\n");
}
fclose(fp);
getch();
}
int main()
{
int dch;
int i,j,n;
dstart=(node *)malloc(sizeof(node));
dstart=NULL;
do{
dch=dmenu();
switch(dch) {
case 1: dadd();
break;
case 2: dfind();
break;
case 3: dstart = sort(dstart);;
break;
case 4: ddel();
break;
case 5: ddisp();
break;
}
}while(dch!=6);
}
我已完成此代码,但我无法删除和排序record.txt文件中的记录。
答案 0 :(得分:1)
要对文件进行排序:读取所有记录,在内存中对它们进行排序,然后在刷新的文件中写入所有记录(以w
模式打开它以将其重置为空文件)。如果有太多记录要在内存中处理它们,您可能需要找到一些替代方法(索引会更合适)。
要删除:您无法删除文件中的内容,您需要重写大部分文件。如果没有那么多记录,请读取所有记录,从内存结构中删除该记录,然后重写一个新文件。在记录太多的情况下,您可能会找到一些替代方案。
答案 1 :(得分:0)
首先问自己一些关于你的程序应该如何处理添加/存储/搜索和删除记录的问题。只有在此开始修改它之后。
例如。你想在磁盘或内存中处理你的数据吗?如果您希望以列表的形式处理内存中的电话列表 - 您何时将内存中的内容与磁盘上的内容同步?至于现在,当你必须打开关闭数据文件时,或者我们的建议应该集中在删除/排序内存或磁盘上的记录时,你的代码还不清楚。
即使没有粗略的设计,您也有太多方法可以改变您的计划。