如何用C语言编写一个链表?

如何用C语言编写一个链表?,第1张

可以用结构体和指针来实现

定义:

定义一个单个元素的结构

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;
}

发牌原程序见我的空间(>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12591082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存