中易网

用双向链表作数据结构,

答案:2  悬赏:80  
解决时间 2021-04-28 10:21
  • 提问者网友:前事回音
  • 2021-04-27 20:43
每条信息至包含 :姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)几项。
最佳答案
  • 二级知识专家网友:晚安听书人
  • 2021-04-27 21:39

一共有三个文件:main.c Info.h data.txt 不用我说都是干什么用的吧



//main.c


#include <stdio.h>
#include "Info.h"



int main(int argc, char *argv[])
{

RList * p = (RList *)malloc(sizeof(RList));
printf("初始化系统...\n");
initlist(p);
system("pause");

printf("加载文件...!\n");
load(p);
system("pause");

system("cls");
printf("记录展示:\n");
display(p);
system("pause");

record * pr = rearch(p,"MuMuDan");
printf("\n找到%s",pr->strName);
system("pause");

if((pr = rearch(p,"Illidan")) != 0)
{
printf("\n找到了%s,按任意键删除它\n",pr->strName);
system("pause");
deleterecord(p,"Illidan");
}
else printf("\n没有找到\"Illidan\"这个记录");

printf("保存中....\n");
save(p);
system("pause");
printf("再见!\n");

return 0;
}



//Info.h


//-----------------------------------------
//文件名:Info.cpp
//记录的定义以及函数声明与实现
//--------------------------------------------
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#ifndef _INFO_H
#define _INFO_H
//--------------------------------------------
enum STATE{CHINA = 1,JAPAN = 2,OTHER = 3};
//--------------------------------------------
typedef struct _record
{//记录结构体
char strName[20];
char strStreet[40];
char strCity[20];
char strEip[10];
enum STATE eState;



struct _record * pre;
struct _record * next;



}record,*pRecord;


typedef struct _RList
{//双向链表
int nNumbers;
record * pFirst;
}RList,*pRList;
//--------------------------------------------
//函数列表:
//初始化列表:initlist();
//输入记录:entry();
//展示列表:display();
//搜索特定记录:search();
//删除特定记录:delete();
//存盘:save();
//加载:load();
//---------------------------------------------
int initlist(RList * prl)
{//初始化空表
prl->nNumbers = 0;
prl->pFirst = 0;
return 1;
}


int entry(RList * prl)
{//输入
record * p = (record *)malloc(sizeof(record));
int sta;

printf("请输入姓名:\n");
scanf("%s",p->strName);

printf("请输入街道:\n");
scanf("%s",p->strStreet);

printf("请输入城市:\n");
scanf("%s",p->strCity);

printf("请输入邮编:\n");
scanf("%s",p->strEip);

printf("请输入国家代码(1.中国; 2.日本; 3.其它):\n");
scanf("%d ",sta);
switch(sta)
{
case 1: p->eState = CHINA; break;
case 2: p->eState = JAPAN; break;
case 3: p->eState = OTHER; break;
default:
{
printf("输入出错");
return 0;//出错
}
}
//双向链表插入
if(prl->pFirst == 0)
{//成为首个记录
prl->pFirst = p;
p->next = p->pre = 0;
}
else
{//头插法
p->next = prl->pFirst;
p->pre = 0;
prl->pFirst->pre = p;
prl->pFirst = p;
}

prl->nNumbers++;

return 1;//成功
}
//搜索特定记录
record * rearch(RList * prl, char * name)
{
record * p = 0;

for (p = prl->pFirst;p;)
{
if (strcmp(p->strName,name) == 0)
{
break;
}
p = p->next;
}
return p;//返回,可能是空值
}


int deleterecord(RList * prl, char * name)
{
record * p = rearch(prl,name);

if (p != 0)// p不为空,找到其值
{
if (prl->nNumbers == 1)
{//只有一个记录
prl->pFirst = 0;
}
else if (prl->nNumbers > 1)
{
if (p->pre == 0)
{//首个结点
prl->pFirst = p->next;
prl->pFirst->pre = 0;
}
else if (p->next == 0)
{//末个结点
p->pre->next = 0;
}
else
{//其它情况
p->next->pre = p->pre;
p->pre->next = p->next;
}
}
}
prl->nNumbers--;

free(p);//释放空间
return 1;
}


void display(RList * prl)
{
record * p = prl->pFirst;
printf("---------------------------\n");
for (;p;p = p->next)
{
printf("姓名:%s\n",p->strName);
printf("入街道:%s\n",p->strStreet);
printf("城市:%s\n",p->strCity);
printf("邮编:%s\n",p->strEip);
printf("国家代码:%d(1.中国; 2.日本; 3.其它):\n\n",p->eState);
}
printf("---------------------------\n");
printf("一共有%d个记录",prl->nNumbers);
}


int load(RList * prl)
{//载入
record * p;
char sta[20];
FILE * fp = fopen("data.txt","r");
if (!fp)
{
printf("加载失败!\n");
return 0;
}
prl->nNumbers = 0;

while(!feof(fp))
{
p = (record *)malloc(sizeof(record));
fscanf(fp,"%s",p->strName);
fscanf(fp,"%s",p->strStreet);
fscanf(fp,"%s",p->strCity);
fscanf(fp,"%s",p->strEip);
fscanf(fp,"%s\n",sta);//这里面的\n一定要加上
switch(atoi(sta))
{
case 1: p->eState = CHINA; break;
case 2: p->eState = JAPAN; break;
case 3: p->eState = OTHER; break;
default:
{
return 0;//出错
}
}

//双向链表插入

if(prl->pFirst == 0)
{//成为首个记录
prl->pFirst = p;
p->next = p->pre = 0;
}
else
{//头插法
p->next = prl->pFirst;
p->pre = 0;
prl->pFirst->pre = p;
prl->pFirst = p;
}
prl->nNumbers++;
}
fclose(fp);
return 1;//成功
}


int save(RList * prl)
{
record * p = prl->pFirst;
FILE * fp = fopen("data.txt","w");
if (!fp)
{
printf("保存失败!\n");
return 0;
}
for (;p;p = p->next)
{
fprintf(fp,"%s\t",p->strName);
fprintf(fp,"%s\t",p->strStreet);
fprintf(fp,"%s\t",p->strCity);
fprintf(fp,"%s\t",p->strEip);
fprintf(fp,"%d\n",p->eState);
}
printf("一共保存%d个记录!\n",prl->nNumbers);
fclose(fp);
}


#endif



//数据data.txt


HeXiaoFeng ZhuStr Tokyo 066004 2
MuMuDan TanshanRoad QinHuangDao 0A2514 1
Illidan ShaStr. Mesha DC25145 3



运行结果:



全部回答
  • 1楼网友:猎杀温柔
  • 2021-04-27 21:54
用SQL来做啦
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息