| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:单链表操作问题的求助
只看楼主 加入收藏
bin903
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-2-23
收藏
 问题点数:0 回复次数:3 
单链表操作问题的求助

学生信息管理系统文档

问题描述:编写程序进行学生信息的处理,该程序具有添加新学生、显示全部、删除、删除全部、修改、退出等功能。
要求:用单链表进行处理。
通过一个结构体,定义了每个记录的基本形式。
struct node
{ char n[20];//姓名
char wid[20];//学号
char sex[5];//性别
char tel[10];//电话
char birth[20];//出生年月
char addr[35];//详细地址
struct node *next;
}NODE;

display() 此函数用来显示主目录的界面,让使用本程序的使用者能够通过1、2、3、4、5、6、7简单的操作此系统,得到程序的效果。

*********************欢迎使用本系统******************
*****************************************************
1:增加学生信息!
2:修改学生信息!
3:查找学生信息!
4:显示所有学生!
5:删除学生信息!
6:删除所有学生信息!
7:退出!
****************************************************


下面分别介绍一下各个函数基本作用:
Add()函数用来添加一个新的记录,加一个新的学生信息之后,可按任意一键返回主菜单。
Del()函数用来删除一个记录,在删除时,先查找该员工是否有,如果有则删除,反之,给出提示“查无此人!!”,删除完毕,同样可按任意键返回主目录。
Deleteall 函数用来删除所有记录,
Edit函数用来修改记录,同以上两个函数差不多,要查找是否有此员工信息,只有有此员工信息,才能修改,否则不能修改。
print()此函数用来显示员工信息,同时按下任意键可返回主目录。
printall() 此函数用来显示所有员工的所有信息,同时按下任意键可返回主目录。

搜索更多相关主题的帖子: 单链 
2006-02-23 23:42
subway2008
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-3-15
收藏
得分:0 
我去年做了一个

世界之所以精彩,是因为有我的存在 我的Email:subway2008@
2006-03-16 18:01
subway2008
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-3-15
收藏
得分:0 
我去年课程设计时作了一格学生成绩管理系统,使用了文件,
现在将代码给你,好好看看吧,有些不一样的地方自己去改一下,
但完成的功能一样
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<graphics.h>
#define length sizeof(struct student)
struct student
{int code;
char name[20];
int english;
int maths;
int computer;
int ave;
int tot;
}stud[50];
int k,n;



void begin()//创建文件,记录学生信息
{ FILE *fp;
struct student *p;
int i=0;
clrscr();
p=stud;
clrscr();
gotoxy(30,5);textcolor(5);cprintf("GEGIN");
if((fp=fopen("d:\record","rb"))==NULL)
{
fp=fopen("d:\record","wb+");
gotoxy(10,6);
textcolor(2);
cprintf("tell me how long has the list?");
gotoxy(10,7);
scanf("%d",&n);
gotoxy(10,8);
textcolor(5);
cprintf(" Code English Maths Computer Name");
textcolor(14);
gotoxy(10,9);cprintf("----------------------------------------");
for(i=0;i<n;i++)
{
gotoxy(10,i+10);textcolor(1+i);
scanf("%d %d %d %d %s",&(i+p)->code,&(p+i)->english,&(p+i)->maths,
&(p+i)->computer,(p+i)->name);
}
fwrite(&n,2,1,fp);
for(i=0;i<n;i++)
fwrite((p+i),length,1,fp) ;
fclose(fp);
}
fclose(fp);
}

void display()//分屏显示学生信息
{
FILE *fp;
struct student *p;
int i,j=0,m=0;
p=stud;
clrscr();
gotoxy(35,5);textcolor(2);cprintf("DISPLAY");
fp=fopen("d:\record" ,"rb");
fread(&n,2,1,fp);
gotoxy(10,6);
textcolor(13);
cprintf("the list has %d records",n);
if(n%8==0)
k=n/8;
else
k=1+n/8;
if(k==1) {
for(i=0;i<n;i++)
{ gotoxy(10,7);
textcolor(5);
cprintf("Code Name English Maths Computer Tot Ave");
gotoxy(10,8);
textcolor(14);
cprintf("-------------------------------------------------->");
fread((p+i),length ,1,fp);
gotoxy(10,i+9);
textcolor(1+i);
cprintf("%d %s %d %d %d %d %d",(p+i)->code,(p+i)->name,
(p+i)->english,(p+i)->maths,(p+i)->computer,(p+i)->tot ,(p+i)->ave);
}
}
else {
for(j=0;j<k-1;j++)
{
gotoxy(10,7);
textcolor(5);
cprintf("code name english maths computer tot ave");
gotoxy(10,8);
textcolor(14);
cprintf("-------------------------------------------------->");
m=0;
for(i=j*8;i<8*j+8;i++)
{
fread((p+i),length ,1,fp);
gotoxy(10,m+9); textcolor(1+i);
cprintf("%d %s %d %d %d %d %d",(p+i)->code,(p+i)->name, (p+i)->english,
(p+i)->maths,(p+i)->computer,(p+i)->tot ,(p+i)->ave);
m++;
}
getch();
clrscr();
}
for(i=8*j;i<8*j+n;i++)
{ m=0;
gotoxy(10,7);
textcolor(5);
cprintf("Code Name English Maths Computer Tot Ave");
gotoxy(10,8);
textcolor(4);
fread((p+i),length ,1,fp);
gotoxy(10,m+9); textcolor(i+1);
cprintf("%d %s %d %d %d %d %d",(p+i)->code,(p+i)->name,
(p+i)->english,(p+i)->maths,(p+i)->computer,(p+i)->tot ,(p+i)->ave);
m++;
}
}
fclose(fp);
gotoxy(10,22);
textcolor(89999);cprintf("press any key to exit");
getch();
}

void insert()//增加学生信息记录
{ FILE *fp;
struct student *p;
int i,j,t;
int m;
p=stud;
clrscr();
gotoxy(20,5); textcolor(2);cprintf("Insert");
fp=fopen("D:\record","rb");
fread(&n,2,1,fp);
gotoxy(10,6);
textcolor(13);
cprintf("the list has %d records",n);
gotoxy(10,7);
textcolor(4);
cprintf("put the number that you want to add:") ;
gotoxy(10,8);
textcolor(5);
j=n;
fclose(fp);
scanf("%d",&t);
n=n+t;
gotoxy(10,9);
textcolor(5);
cprintf("code english maths computer name");
gotoxy(10,10);
textcolor(14);
cprintf("-------------------------------------------------->");
for(i=0;i<t;i++)
{ gotoxy(10,i+11);
scanf("%d %d %d %d %s",&(p+i+j)->code,&(p+i+j)->english,
&(p+i+j)->maths,&(p+i+j)->computer,(p+i+j)->name);
}
fp=fopen("d:\record","rb+");
fwrite(&n,2,1,fp);
fclose(fp);
fp=fopen("d:\record","ab+");
fseek(fp,j*sizeof(struct student)+2,0);
for(i=0;i<t;i++)
fwrite((p+i+j),length,1,fp);
fclose(fp);
}

int search ()//在文件中查找学生信息
{ FILE *fp;
struct student *p;
int num,i,t=-1;
p=stud;
clrscr();
gotoxy(30,5);textcolor(5);cprintf("SEARTH");
fp=fopen("d:\record" ,"rb");
fread(&n,2,1,fp);
gotoxy(10,6);
textcolor(13);
cprintf("the list has %d records",n);
gotoxy(10,8);
textcolor(2);
cprintf("put the number you want search:");
gotoxy(10,9);
scanf("%d",&num);
for(i=0;i<n;i++)
{
fread((p+i),length,1,fp);
if((p+i)->code==num)
{
gotoxy(10,10);textcolor(13);
t=i+1;
cprintf("the record which you want to searth is %dth !!!",t);
gotoxy(10,11);
textcolor(5);
cprintf("code name english maths computer tot ave");
gotoxy(10,12);
textcolor(14);
cprintf("-------------------------------------------------->");
gotoxy(10,13);
cprintf("%d %s %d %d %d ",(p+i)->code,
(p+i)->name, (p+i)->english,(p+i)->maths,(p+i)->computer);
}
}
if(t==-1)
{ gotoxy(10,13);
textcolor(5);
cprintf("sorry ,can not find the record,please display the record:");
t=-1;
}
fclose(fp);
gotoxy(10,22) ;
textcolor(89999);
cprintf("press any key to exit");
getch();
return t;
}

void delete1()//删除学生信息
{ FILE *fp,*fp1;
struct student *p,*p1;
int i=0,t,j=0 ;
char ch;
clrscr();
gotoxy(30,5);
textcolor(2);
cprintf("DELETE");
p=stud; p1=stud;
fp=fopen("d:\record" ,"rb");
t=search();
fread(&n,2,1,fp);
printf("the list has %d records",n);
fclose(fp);
if(t!=-1)
{ gotoxy(10,15);
textcolor(2);
cprintf("did you want delete %dth record really?",t);
gotoxy(10,17);textcolor(5);
cprintf("please enter your choice Y or N ? ");
gotoxy(25,18);
ch=getch();
if(ch!=n)
{n-- ;
fp=fopen("d:\record","rb");
for(i=0;i<t-1;i++)
{fread((p+i),length,1,fp);
(p1+j)->code=(p+i)->code;
strcpy((p1+j)->name,(p+i)->name);
(p1+j)->english=(p+i)->english;
(p1+j)->computer=(p+i)->computer;
(p1+j)->maths=(p+i)->maths;
(p1+j)->tot=(p+i)->tot;
(p1+j)->ave=(p+i)->ave;
j++;
}
fread((p+i),length,1,fp);
for(i=t;i<n+1;i++)
{
fread((p+i),length,1,fp);
(p1+j)->code=(p+i)->code;
strcpy((p1+j)->name,(p+i)->name);
(p1+j)->english=(p+i)->english;
(p1+j)->computer=(p+i)->computer;
(p1+j)->maths=(p+i)->maths;
(p1+j)->tot=(p+i)->tot;
(p1+j)->ave=(p+i)->ave;

j++;
}
fclose(fp);
fp1=fopen("d:\temp","wb");
fwrite(&n,2,1,fp1);
for(i=0;i<j;i++)
fwrite((p1+i),length,1,fp1);
fclose(fp1);
remove("d:\record");
rename("d:\temp","d:\record");
}


}
getch();

}

void modify()//修改学生信息,并保存至文件
{
FILE *fp;
struct student *p;
int t,i;
char ch;
clrscr();
gotoxy(30,5);textcolor(14);cprintf("MODIFY");
p=stud;


fp=fopen("d:\record","rb");
fread(&n,2,1,fp);
t=search();
if(t!=-1)
{
gotoxy(10,15); textcolor(5);
cprintf("did you want delete %dth record really?",t);
gotoxy(10,16);textcolor(4);
cprintf("please enter your choice Y or N ?");
gotoxy(10,17); ch=getch();
if(ch!=n)
{ fread((p+t-1),length,1,fp);
gotoxy(22,16);textcolor(2);


gotoxy(10,18);
cprintf("Code English Maths Computer Name");
textcolor(14);
gotoxy(10,19);cprintf("----------------------------------------");
gotoxy(10,20);
scanf("%d %d %d %d %s",&(p+t-1)->code, &(p+t-1)->english,
&(p+t-1)->maths,&(p+t-1)->computer,(p+t-1)->name);

}
}
fclose(fp);
fp=fopen("d:\record","wb") ;
fwrite(&n,2,1,fp);
for(i=0;i<n;i++)
fwrite((p+i),length,1,fp);
fclose(fp);
getch();

}

void count()//计算学生成绩,并写入文件
{ FILE *fp;
struct student *p;
int E,M,C,T,A,NUM;
char NAME[20];
int i,j;
gotoxy(30,5);textcolor(4);cprintf("COUNT");
p=stud;
fp=fopen("d:\record" ,"rb");
fread(&n,2,1,fp);
for(i=0;i<n;i++)
{ fread((p+i),length,1,fp);
(p+i)->tot=(p+i)->computer +(p+i)->english+(p+i)->maths;
(p+i)->ave=(p+i)->tot/3;
}
for(j=0;j<n;j++)
{fread(p,length,n,fp);
for(i=0;i<n-j-1;i++)
if((p+i)->tot>(p+i+1)->tot)
{ NUM=(p+i)->code;(p+i)->code=(p+i+1)->code;(p+i+1)->code=NUM;
E=(p+i)->english;(p+i)->english=(p+i+1)->english;(p+i+1)->english=E;
M=(p+i)->maths;(p+i)->maths=(p+i+1)->maths;(p+i+1)->maths=M;
C=(p+i)->computer;(p+i)->computer=(p+i+1)->computer;(p+i+1)->computer=C;
T=(p+i)->tot; (p+i)->tot=(p+i+1)->tot;(p+i+1)->tot=T;
A=(p+i)->ave;(p+i)->ave=(p+i+1)->ave;(p+i+1)->ave=A;
strcpy(NAME,(p+i)->name); strcpy((p+i)->name,(p+i+1)->name);strcpy((p+i+1)->name,NAME);
}
}
fclose(fp);
fp=fopen("d:\record","wb");
fwrite(&n,2,1,fp);
for(i=0;i<n;i++)
fwrite((p+i),length,1,fp);
fclose(fp);
display();
}







void menu()//菜单
{ int t;
gotoxy(35,6);
cprintf("menu");
gotoxy(20,9);
textcolor(4);cprintf("1:dispaly");
gotoxy(50,9);
textcolor(4); cprintf("2:insert");
gotoxy(20,12);
textcolor(2); cprintf("3:search");
gotoxy(50,12);
textcolor(2); cprintf("4:delete1");
gotoxy(20,15);
textcolor(9); cprintf("5:modify");
gotoxy(50,15);
textcolor(9);cprintf("6:count");
gotoxy(32,18);
textcolor(3); cprintf("0-------exit");
gotoxy(24,20);
textcolor(13); cprintf("please chose the number:0----6");

cprintf("

");



gotoxy(24,22);
textcolor(89998);cprintf(" enter the number: ");





}

main()
{ int driver ,mode,t;
driver=DETECT;
mode=0;
initgraph(&driver ,&mode, "C:\tc20");
restorecrtmode();
begin();
clrscr();

while(1)
{menu();
while(1)
{scanf("%d",&t);
if(t>=0&&t<=6)
break;
}
switch(t)
{
case 1: display(); clrscr(); break;
case 2: insert(); clrscr(); break;
case 3: search(); clrscr(); break;
case 4: delete1(); clrscr(); break;
case 5: modify(); clrscr(); break;
case 6: count(); clrscr(); break;
case 0: exit(0);

}

}
getch();

}


世界之所以精彩,是因为有我的存在 我的Email:subway2008@
2006-03-16 18:10
qzt040613
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:63
专家分:0
注 册:2006-3-15
收藏
得分:0 

单链表

1、链接存储方法
 链接方式存储的线性表简称为链表(Linked List)。
 链表的具体存储表示为:
  ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
  ② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
注意:
  链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

2、链表的结点结构
┌──┬──┐
|data | next│
└──┴──┘
 data域--存放结点值的数据域
 next域--存放结点的直接后继的地址(位置)的指针域(链域)
注意:
  ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
 ②每个结点只有一个链域的链表称为单链表(Single Linked List)。
【例】线性表(bat,cat,eat,fat,hat,jat,lat,mat)的单链表示如示意图

3、头指针head和终端结点指针域的表示
 单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
注意:
 链表由头指针唯一确定,单链表可以用头指针的名字来命名。
【例】头指针名是head的链表可称为表head。
  终端结点无后继,故终端结点的指针域为空,即NULL。

4、单链表的一般图示法
 由于我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,可以用箭头来表示链域中的指针,线性表(bat,cat,fat,hat,jat,lat,mat)的单链表就可以表示为下图形式。

5、单链表类型描述
typedef char DataType; /* 假设结点的数据域类型为字符 */
typedef struct node { /* 结点类型定义 */
DataType data; /* 结点的数据域 */
struct node *next; /* 结点的指针域 */
} ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意:
 ①LinkList和ListNode *是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
 ②LinkList类型的指针变量head表示它是单链表的头指针
 ③ListNode *类型的指针变量p表示它是指向某一结点的指针

6、指针变量和结点变量


┌────┬────────────┬─────────────┐
│    │    指针变量    │     结点变量    │
├────┼────────────┼─────────────┤
│ 定义 │在变量说明部分显式定义 │在程序执行时,通过标准 │
│ │ │函数malloc生成 │
├────┼────────────┼─────────────┤
│ 取值 │ 非空时,存放某类型结点 │实际存放结点各域内容 │
│ │ 的地址 | │
├────┼────────────┼─────────────┤
│操作方式│ 通过指针变量名访问 │ 通过指针生成、访问和释放 │
└────┴────────────┴─────────────┘

①生成结点变量的标准函数
 p = malloc( sizeof(ListNode) );
/* 函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中 */
②释放结点变量空间的标准函数
 free(p); /* 释放p所指的结点变量空间 */
③结点分量的访问
  利用结点变量的名字*p访问结点分量
方法一:(*p).data和(*p).next
方法二:p-﹥data和p-﹥next
④指针变量p和结点变量*p的关系
  指针变量p的值——结点地址
 结点变量*p的值——结点内容
 (*p).data的值——p指针所指结点的data域的值
 (*p).next的值——*p后继结点的地址
  *((*p).next)——*p后继结点
注意:
  ① 若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。
  ② 有关指针类型的意义和说明方式的详细解释


天地无极,我本逍遥!
2006-04-17 21:56
快速回复:单链表操作问题的求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022208 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved