可以用结构体和指针来实现
定义:
定义一个单个元素的结构
typedef struct Chain_tag { // 这里用typedef来定义,方便使用int data; // 这里的数据可以是任意类型
//其他数据
struct Chain_tag prev, next;// 由于Chain为不完全类型,故只能用指针的方式声明
} Chain;
使用:
用单个结构体的指针作为head
#include <malloch>//Chain的定义写在这里
Chain
alloc_single_chain(int data /, (其他参数)/)
{
Chain tmp;
tmp = malloc(sizeof(Chain));
tmpdata = data;
//其余数据初始化
tmpprev = tmpnext = NULL; // 将前后指针置为NULL
return tmp;
}
void
dispose_chain(Chain target) //其实这里功能简单,用宏实现也可以
{
free(target);
return;
}
int main()
{
Chain head;
Chain pos;
head = alloc_single_chain(10);//初始化起始结点
head->next = alloc_single_chain(11);//同理。。下一个结点
for (pos = head; pos; pos = pos->next)//清理垃圾好习惯
{
dispose_chain(pos);
}
return 0;
}
这里有几点要注意:
由于链表用指针来实现,故不要忘记分配内存
垃圾清理时一定要从起始结点开始依次向后释放,以防内存泄漏
换了一个,你看看:
#include
#include
#include
#include//输入/输出文件流类
usingnamespacestd;
constintMaxr=100;//最多的读者
constintMaxb=100;//最多的图书
constintMaxbor=5;//每位读者最多借五本书
//读者类,实现对读者的信息的描述
classReader
{
private:
inttag;//删除标记1:已删0:未删
intno;//读者编号
charname[10];//读者姓名
intborbook[Maxbor];//所借图书
public:
Reader(){}
chargetname(){returnname;}//获取姓名
intgettag(){returntag;}//获取删除标记
intgetno(){returnno;}//获取读者编号
voidsetname(charna[])//设置姓名
{
strcpy(name,na);
}
voiddelbook(){tag=1;}//设置删除标记1:已删0:未删
voidaddreader(intn,charna)//增加读者
{
tag=0;
no=n;
strcpy(name,na);
for(inti=0;i
borbook[i]=0;
}
voidborrowbook(intbookid)//借书 *** 作
{
for(inti=0;i
{
if(borbook[i]==0)
{
borbook[i]=bookid;
return;
}
}
}
intretbook(intbookid)//还书 *** 作
{
for(inti=0;i
{
if(borbook[i]==bookid)
{
borbook[i]=0;
return1;
}
}
return0;
}
voiddisp()//读出读者信息
{
cout
for(inti=0;i
if(borbook[i]!=0)
cout
cout
}
};
//读者类库,实现建立读者的个人资料
classRDatabase
{
private:
inttop;//读者记录指针
Readerread[Maxr];//读者记录
public:
RDatabase()//构造函数,将readertxt读到read[]中
{
Readers;
top=-1;
fstreamfile("readertxt",ios::in);//打开一个输入文件
while(1)
{
fileread((char)&s,sizeof(s));
if(!file)break;
top;
read[top]=s;
}
fileclose();//关闭readertxt
}
voidclear()//删除所有读者信息
{
top=-1;
}
intaddreader(intn,charna)//添加读者时先查找是否存在
{
Readerp=query(n);
if(p==NULL)
{
top;
read[top]addreader(n,na);
return1;
}
return0;
}
Readerquery(intreaderid)//按编号查找
{
for(inti=0;i
if(read[i]getno()==readerid&&
read[i]gettag()==0)
{
return&read[i];
}
returnNULL;
}
voiddisp()//输出所有读者信息
{
for(inti=0;i
read[i]disp();
}
voidreaderdata();//读者库维护
~RDatabase()//析构函数,将read[]写到readertxt文件中
{
fstreamfile("readertxt",ios::out);
for(inti=0;i
if(read[i]gettag()==0)
filewrite((char)&read[i],sizeof(read[i]));
fileclose();
}
};
voidRDatabase::readerdata()
{
charchoice;
charrname[20];
intreaderid;
Readerr;
while(choice!='0')
{
cout
cin>>choice;
switch(choice)
{
case'1':
cout
cin>>readerid;
cout
cin>>rname;
addreader(readerid,rname);
break;
case'2':
cout
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout
break;
}
cout
cin>>rname;
r->setname(rname);
break;
case'3':
cout
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout
break;
}
r->delbook();
break;
case'4':
cout
cin>>readerid;
r=query(readerid);
if(r==NULL)
{
cout
break;
}
r->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:cout
}
}
}
//图书类,实现对图书的描述,图书的编号,书名,借出,还入等
classBook
{
private:
inttag;//删除标记1:已删0:未删
intno;//图书编号
charname[20];//书名
intonshelf;//是否再架1:再架2:已借
public:
Book(){}
chargetname(){returnname;}//获取姓名
intgetno(){returnno;}//获取图书编号
intgettag(){returntag;}//获取删除标记
voidsetname(charna[])//设置书名
{
strcpy(name,na);
}
voiddelbook(){tag=1;}//删除图书
voidaddbook(intn,charna)//增加图书
{
tag=0;
no=n;
strcpy(name,na);
onshelf=1;
}
intborrowbook()//借书 *** 作
{
if(onshelf==1)
{
onshelf=0;
return1;
}
return0;
}
voidretbook()//还书 *** 作
{
onshelf=1;
}
voiddisp()//输出图书
{
cout
}
};
//图书库类,实现对图书的维护,查找,删除等
classBDatabase
{
private:
inttop;//图书记录指针
Bookbook[Maxb];//图书记录
public:
BDatabase()//构造函数,将booktxt读到book[]中
{
Bookb;
top=-1;
fstreamfile("booktxt",ios::in);
while(1)
{
fileread((char)&b,sizeof(b));
if(!file)break;
top;
book[top]=b;
}
fileclose();
}
voidclear()//全删
{
top=-1;
}
intaddbook(intn,charna)//增加图书
{
Bookp=query(n);
if(NULL==p)
{
top;
book[top]addbook(n,na);
return1;
}
return0;
}
Bookquery(intbookid)//查找图书
{
for(inti=0;i
if(book[i]getno()==bookid&&book[i]gettag()==0)
{
return&book[i];
}
returnNULL;
}
voidbookdata();//图书库维护
voiddisp()
{
for(inti=0;i
if(book[i]gettag()==0)
book[i]disp();
}
~BDatabase()//析构函数,将book[]写到booktxt文件中
{
fstreamfile("booktxt",ios::out);
for(inti=0;i
if(book[i]gettag()==0)
filewrite((char)&book[i],sizeof(book[i]));
fileclose();
}
};
voidBDatabase::bookdata()
{
charchoice;
charbname[40];
intbookid;
Bookb;
while(choice!='0')
{
cout
cout
cin>>choice;
switch(choice)
{
case'1':
cout
cin>>bookid;
cout
cin>>bname;
addbook(bookid,bname);
break;
case'2':
cout
cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout
break;
}
cout
cin>>bname;
b->setname(bname);
break;
case'3':
cout
cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout
break;
}
b->delbook();
break;
case'4':
cout
cin>>bookid;
b=query(bookid);
if(b==NULL)
{
cout
break;
}
b->disp();
break;
case'5':
disp();
break;
case'6':
clear();
break;
default:cout
}
}
}
//main()函数的实现,程序的主界面的引导
voidmain()
{
charchoice;
intbookid,readerid;
RDatabaseReaderDB;
Readerr;
BDatabaseBookDB;
Bookb;
while(choice!='0')
{
cout
cout
cin>>choice;
switch(choice)
{
case'1':
cout
cin>>readerid;
cout
cin>>bookid;
r=ReaderDBquery(readerid);//按编号查找
if(NULL==r)
{
cout
break;
}
b=BookDBquery(bookid);
if(b==NULL)
{
cout
break;
}
if(b->borrowbook()==0)
{
cout
break;
}
r->borrowbook(b->getno());
break;
case'2':
cout
cin>>readerid;
cout
cin>>bookid;
r=ReaderDBquery(readerid);
if(r==NULL)
{
cout
break;
}
b=BookDBquery(bookid);
if(b==NULL)
{
cout
break;
}
b->retbook();
r->retbook(b->getno());
break;
case'3':
BookDBbookdata();
break;
case'4':
ReaderDBreaderdata();
break;
default:cout
}
}
}
首先typedef 可以定义一个比较简便的写法用于替代之后你声明的一个结构,在你的例子里面,你将可以用 PPoint 这个写法来代替 struct pointTag你的struct pointTag 是一个包含两个浮点数的结构。
也就是说你做完这个声明以后可以这样:
PPoint a ;
声明一个叫a的包含两个浮点数的结构。for(int i=0;i<n;i++) if (a[i]<val) return false;
return true;
没看懂补充的……b和a是什么关系?是要找b里面最小的一个?#include<stdioh>
#include<stringh>
#include<stdlibh>
#define INI 20
#define INC 10
char input; //指向动态数组
int get_input(); //用于接收输入值的函数,使用动态数组可以任意输入,无大小限制
void ini(); //系统初始化
bool is_exit(); //检测是否退出
int split(); //将字符串分解出6位的数字
bool is_number(char number); //判断一个char类型的元素是否为数字
void delete_all(); //删除动态数组
int main(){
ini();
while (1){
get_input();
if (is_exit())
break;
split();
delete_all();
}
delete_all();
return 0;
}
int get_input(){
int limit = INI,cnt = 0;
char ch;
input = (char )malloc(sizeof(char)INI);
while ((ch = getchar())!='\n'){
if (cnt + 1 >= limit){ //如果数组大小不够,那么重新申请更大的空间
char tmp = input;
limit += INC;
input = (char )malloc(sizeof(char)limit);
for (int i = 0; i < cnt; ++i)
input[i] = tmp[i];
}
input[cnt++] = ch;
}
input[cnt] = '\0';
return 0;
}
int split(){
int number = 0;
int index = 0;
int tag = 0,cnt = 1,is_six = 0;
while (input[index]!='\0'){
if (is_number(input[index])&&is_six!=6){ //如果是数字,同时数字位数没有达到6
tag = 1; //标志经过了数字元素
number = number 10 + input[index] - '0'; //计算值的大小
is_six++;
}
else{ //如果是非数字那么打印之前的数字
if (tag == 1){
printf("#%d:\t\t%d\n", cnt++, number);
tag = number = 0;
if (is_six == 6){ //将数字位数的标记置为0
is_six = 0;
continue;
}
is_six = 0;
}
}
index++;
}
if (tag == 1){ //打印以数字结尾的最后一个数字
printf("#%d:\t\t%d\n", cnt++, number);
tag = number = 0;
}
return 0;
}
bool is_number(char number){
if (number <= '9' && number >= '0')
return true;
return false;
}
bool is_exit(){
if (strcmp(input, "exit") == 0)
return true;
return false;
}
void ini(){
printf("请输入字符串:(exit退出)\n");
}
void delete_all(){
free(input);
input = NULL;
}发牌原程序见我的空间(>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)