用双向链表作数据结构,
- 提问者网友:前事回音
- 2021-04-27 20:43
- 二级知识专家网友:晚安听书人
- 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