c语言双向链表
Ⅰ 用c语言怎么编出来课程表
一、功能模块概要说明:
1.输入函数:
char* uscanf(int,int,int) //图形模式下输入函数,大小写26个字母0-9数字外加空格键为有效输入,可以使用BACKSPACE。
2.开始界面,退出界面和主界面:
void starting() //开始界面
void end() //结束界面
char* index() //主选择界面函数,返回选择信息(字符串);
3.数据输入、创建链表模块
char* tinkey(char*,int,int) //输入切换处理
char* recourse(char*,int,int) //课程输入
int wdetect(struct person*,char*) //课程输入检测,检测课表一星期同一天同一时间段内课程安排是否重复,如果重复给出修改提示信息
char* infuse(char*,char*,int) //课表输入
struct course *ccreat(char*) //创建课程单向链表
struct person* pcreat(char *) //创建个人课表节点
char *infcreat(char**,struct person**,struct person**,char*)
//创建课表双向链表
4.课表输出
char *print(char*) //课表输出背景界面
char *pkey() //课表输出按纽界面及处理
int table(int,int,struct person*) //在指定区域一表格形式输出一个人的课表
int forebox(struct person*) //初略显示下三个人的课表提示
5.文件存储和装载
char* save(char *,struct person *) //保存为磁盘文件,在图形模式下进行文件读写操作之后,程序出现莫名其妙的异常显示情形
6.课表查询:
struct person *pdemand(struct person *,char *) //按人名字查询其课表安排。
struct person* wddemand(struct person*,int) //按星期几查询课程安排情况。
struct person *cdemand(struct person *,char *) //按课程查询老师或学生课程安排情况。
char *demand(struct person *) // 查询切换,并显示查询结果,按名字查询一次只能一个。按星期几和课程查询可以查询到多个,如查询到多个接果,按任意键可依次输出。
7.排序。
struct course *csort(struct course *) //按课程编号排序课表节点中课程链表
struct person *psort(struct person *) //按人学号或老师编号排序课表链表
char sort(struct person*) //排序切换,并提示排序结果
8.插入。
char *insert(char *,struct person **,struct person **)
//擦入课表节点
9.删除。
char *delete(struct person **,char *)
//按人名删除其课表节点
二、操作说明:
1. Infuse:选定这个键后按Enter进入学生输入菜单,你可以输入学生的学号,姓名,学生在一学期内的所学课程的课程名,课程号,学时,以及在一周内上课的地址。如果当输入某课程上课地址有重复时,系统自动发出报警信息,并提示出错的地方,以便修改,
当选定couse时,表明此学生所学的该课程的信息输入完成再输入另外所学课程的信息,如上所写照样输入,
当选定finish时,并按回车键后,表明此学生在这一学期内所学的课程信息输入完成。如要继续输入学生的信息如前所述。
当选定back时,并按下回车键后,返回TIME TABLE主菜单,选择主菜单里的功能对所输入的信息进行处理。
当选定exit时,并按下回车键后,返回程序。结束程序。
2.SAVE/LOAD 选定此并按回车。此键作用对所输入的信息进行格式输出/载入。输入你要保存信息的文件名,文件格式系统自动生成。利用键盘上的方向键和TAB键进行控制。
3.DEMAND:按ENTER键开始输入,按反向键进行查询切换。当按星期几和课程查询时候,如遇到查询到多个结果,按任意键可依次输出直到完。
4.INSERT:按ENTER键开始输入,按反向键进行查询切换。输入同INFURE项。
5. DELETE: 按ENTER键显示输入框开始输入。其他同上。
6.SORT:当提示框中SORT变为红色时候,表示被选中,按ENTER键开始插入,如成功给出提示信息。
7.PRINT:依次输出链表,如果输出链表为空则不进仍输出页面。NEXT为下一个,PRO为上一个。下面FORENOTICE 框显示后三个节点。
8.EXIT:退出系统。效果同按ESC。
三、例程:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intmain()
{
char*p[8][5],*a;
inti=0,j=0,n;
a=(char*)malloc(sizeof(char));
for(j=0;j<5;j++)
for(i=0;i<8;i++)
{
printf("周%d第%d节",j+1,i+1);
scanf("%s",a);
p[j][i]=a;
a=(char*)malloc(sizeof(char));
}
printf("周一 周二 周三 周四 周五 ");
for(j=0;j<5;j++){
for(i=0;i<8;i++)
{
printf("%s ",p[j][i]);
}
printf(" ");
}
}
Ⅱ C语言中->是什么意思啊
“->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。
换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。
问题中的p=p->next ,意思是将p指向的一个结构体实例中的自数据next赋值给p。
(2)c语言双向链表扩展阅读:
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
定义与声明:
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
Ⅲ 求一个只用c语言编写的仓库管理系统
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#definemax32
intifempty=0;//标志,判断链表是无否为空
typedefstructdnode/*定义双向链表结构体*/
{
intnumber;/*货物编号*/
charname[max];/*货物名称*/
intcounter;/*货物数量*/
structdnode*prior,*next;
/*定义两指针,分别指向其前驱和后继*/
}dlnode;
dlnode*create(dlnode*L);
dlnode*input(dlnode*L);
dlnode*output(dlnode*L);
dlnode*outnum(dlnode*L);
dlnode*outname(dlnode*L);
dlnode*current(dlnode*L);
voidsearch(dlnode*L);
voidprint(dlnode*L);
voidsearchnum(dlnode*L);
voidsearchname(dlnode*L);
voiddisplay(dlnode*L);
voidmain()
{
intx;
dlnode*L;
if(!(L=(dlnode*)malloc(sizeof(dlnode))))//分配空间
{
printf(" ");
exit(1);
}
create(L);///调用函数,创建头节点
while(1)
{////////////////////////主菜单///////////////////////////
printf("============================ ");
printf("1.货物出库和入库 ");
printf("2.查找货物表 ");
printf("3.显示仓库货物表 ");
printf("4.输出到文件 ");
printf("0.退出 ");
printf("============================= ");
printf("选择0--3:");
scanf("%d",&x);
switch(x)
{
case2:search(L);break;//调用查找函数
case1:current(L);break;//调用入库出库函数
case3:display(L);break;//调用显示输出函数
case4:print(L);break;//调用打印函数
case0:printf(" bye!seeyou! ");
getchar();getchar();exit(0);//退出程序
default:printf(" Entererreor!pleaseinput0--4!");
getchar();getchar();
}
}
}
dlnode*create(dlnode*L)//创建链表头节点
{
printf("欢迎使用我的仓库管理系统");
getchar();
ifempty=0;
///////初始化头节点的值////////
L->next=NULL;L->prior=NULL;
L->number=L->counter=0;
strcpy(L->name,"");
returnL;
}
voidsearch(dlnode*L)///查找的主要菜单
{
inty;
if(ifempty==0)
{
printf("没有输入货物! ");
getchar();getchar();
return;
}
else
{
while(1)
{
printf("===================== ");
printf("1.按编号查询 ");
printf("2.按货物名称查询 ");
printf("0.返回上一层 ");
printf("==================== ");
printf("选择0--2:");
scanf("%d",&y);
switch(y)
{
case1:searchnum(L);break;//调用按编号查找的函数
case2:searchname(L);break;//调用按名称查找的函数
case0:return;//返回
default:printf("entererror!Pleaseinput0--2! ");
getchar();getchar();printf(" ");
}
}
}
}
voidsearchnum(dlnode*L)///按编号查找的函数
{
intnum,flag=0;//flag为是否找到的标志
dlnode*head=L;
if(ifempty==0)
{
printf("没有货物被输入 ");
getchar();getchar();
return;
}
printf("输入你要查找的货物编号: ");
scanf("%d",&num);
while((L=L->next)!=head)
{
if(L->number==num)
{flag=1;//flag为1时表示找到
printf("找到指定编号货物 ");
printf(" 编号:%d ",L->number);
printf("名称:%s ",L->name);
printf("数量:%d ",L->counter);
}
}
if(flag==0)//flag为0时表示没有找到
printf("没有找到指定编号货物,请查看是否还有货物。 ");
getchar();getchar();
}
voidsearchname(dlnode*L)//按名称查找的函数
{
intflag=0;//flag为是否找到的标志
charna[32];
dlnode*head=L;
if(ifempty==0)
{
printf("没有货物被输入 ");
getchar();getchar();
return;
}
printf("输入你要查找的货物名称 ");
scanf("%s",&na);
while((L=L->next)!=head)
{
if(strcmp(L->name,na)==0)
{flag=1;//flag为1时表示找到
printf("找到指定名称货物 ");
printf(" 编号:%d ",L->number);
printf("名称:%s ",L->name);
printf("数量:%d ",L->counter);
}
}
if(flag==0)//flag为0时表示没有找到
printf("没有找到指定编号货物,请查看是否还有货物。 ");
getchar();getchar();
}
dlnode*current(dlnode*L)//货物出库入库函数
{
inty;
while(1)
{
printf("======================== ");
printf("1.货物入库 ");
printf("2.货物出库 ");
printf("0.返回上一层 ");
printf("======================== ");
printf("选择0--2:");
scanf("%d",&y);
switch(y)
{
case1:input(L);break;//调用入库函数
case2:output(L);break;//调用出库函数
case0:return(L);//返回上一层
default:printf("entererror!Pleaseinput0--2!");
getchar();getchar();
printf(" ");
}
}
}
dlnode*input(dlnode*L)//定义入库函数
{
dlnode*in,*head;
head=in=(dlnode*)malloc(sizeof(dlnode));//分配空间
head=L;
printf(" 请输入货物数据: ");
printf("编号:");scanf("%d",&in->number);
printf("名称:");scanf("%s",&in->name);
printf("数量:");scanf("%d",&in->counter);
if(L->next==NULL)//如果只有头节点,
{//把刚输入的in节点
L->next=in;//跟在头节点后面
L->prior=in;//
in->next=L;//
in->prior=L;//
ifempty++;//ifempty加1
}
else
{//如果当前L的下一个节点不是头节点
while((L=L->next)!=head)
{//如果输入的数大于L->number,则插到L的前面
if(L->number<in->number)
{
in->next=L;
in->prior=L->prior;
L->prior->next=in;
L->prior=in;
ifempty++;//ifempty加1
return(head);
}
}
//输入的编号比其它编号都小,则插到最后个节点,并首尾相连
head->prior->next=in;
in->prior=head->prior;
head->prior=in;
in->next=head;
ifempty++;//ifempty加1
}
returnhead;
}
dlnode*output(dlnode*L)//出库的函数
{
inty;
dlnode*head=L;
if(ifempty==0)//检测是否有货物输入
{
printf("没有货物输入系统 ");
getchar();getchar();
return(head);
}
while(1)
{
printf("============= ");
printf("1.按编号出库 ");
printf("2.按名称出库 ");
printf("0.返回上一层 ");
printf("============== ");
printf("选择0--2:");scanf("%d",&y);
switch(y)
{
case1:outnum(L);break;//调用按编号出库函数
case2:outname(L);break;//调用按名称出库函数
case0:return(L);
default:printf("entererror!Pleaseinput0--2!");
getchar();getchar();printf(" ");
}
}
}
dlnode*outnum(dlnode*L)//按编号出库函数
{
intnum;
dlnode*head=L;
printf("请输入出库货物的编号:");
scanf("%d",&num);
while((L=L->next)!=head)
{//如果找到就删除节点
if(L->number==num)
{
L->prior->next=L->next;
L->next->prior=L->prior;
ifempty--;//ifempty减1
printf("编号为%d的货物成功出库",num);
getchar();getchar();
returnhead;
}
}
printf("没有此编号的货物,请查看是否还有货物。 ");
getchar();getchar();
return(head);
}
dlnode*outname(dlnode*L)//按名称出库函数
{
charna[32];
dlnode*head=L;
printf("请输入出库货物的名称:");
scanf("%s",&na);
while((L=L->next)!=head)
{//如果找到就删除节点
if(strcmp(L->name,na)==0)
{
L->prior->next=L->next;
L->next->prior=L->prior;
ifempty--;//ifempty减1
printf("名称为%s的货物成功出库",na);
getchar();getchar();
return(head);
}
}
printf("没有此名称的货物,请查看是否还有货物。 ");
getchar();getchar();
return(head);
}
voiddisplay(dlnode*L)//显示货物清单
{
dlnode*head=L;
if(ifempty==0)
{
printf("没有货物可显示 ");
getchar();getchar();
return;
}
L=L->next;
do
{
printf(" 编号:%d ",L->number);
printf("名称:%s ",L->name);
printf("数量:%d ",L->counter);
}while((L=L->next)!=head);
getchar();getchar();
}
voidprint(dlnode*L)
{
dlnode*head=L;
L=L->next;
charfilename[max];
FILE*out;
if(ifempty==0)
{
printf("没有货物可输出 ");
getchar();getchar();
return;
}
printf("请输入文件名称:");
scanf("%s",filename);
if((out=fopen(filename,"w"))==NULL)
{
printf("打开文件失败! ");
getchar();getchar();
return;
}
do{
fprintf(out,"编号:%d 名称:%s 数量:%d ",L->number,L->name,L->counter);
}while((L=L->next)!=head);
printf("输出成功 ");getchar();getchar();
fclose(out);
}