wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
把以下代码放在以“LINLIST.H”的文件中
/***********************************/
typedef struct Node /*自定义一个结构体*/
{
DataType data; /*定义结点的数据域*/
struct Node *next; /*定义指向结构体的指针*/
}SLNode;
/*初始化一个链表,传入指向链表的头指针的指针*/
void ListInitiate(SLNode **head)
{
/*申请一个空间,并把地址赋给头指针*/
if(((*head)=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1);
(*head)->next=NULL;
}
/*计算链表的结点的个数,传入头指针*/
int ListLength(SLNode *head)
{
/*定义一个指向SLNode结构体的指针,并赋予头指针*/
SLNode *p=head;
/*定义一个整型变量,并赋予初值为0*/
int size=0;
while(p->next!=NULL)
{
/*当p->next!=NULL,p指向下一个结点*/
p=p->next;
/*结点个数加一*/
size++;
}
/*返回结点的个数*/
return size;
}
/*向链表插入一个结点,传入头指针,插入的位置和结点的结据域*/
int ListInsert(SLNode *head,int i,DataType x)
{
/*定义两个指向SLNode结构体的指针*/
SLNode *p,*q;
int j;
/*由于在链表中,第一个结点的位置为0,
所以,头结点的位置应为-1*/
j=-1;
p=head;
/*查找i位置的前一个结点*/
while(p->next!=NULL&&j<i-1)
{
p=p->next;
j++;
}
/*当j!=i-1 时,就没有找到*/
while(j!=i-1)
{
printf("The position inserted is EORROR in function ListInsert!\n");
return 0;
}
/*找到,并且p是指向i-1结点*/
/*插入结点*/
if((q=(SLNode *)malloc(sizeof(SLNode)))==NULL) exit(1); /*申请一个空间并将地址赋予q*/
q->data=x; /*把x赋予q的结据域*/
q->next=p->next; /*把结点i的地址赋予q->next*/
p->next=q; /*把结点q赋予p->next*/
return 1;
}
/*删除链表中的一个结点*/
int ListDelete(SLNode *head,int i,DataType *x)
{
/*定义两个指向SLNode结构体的指针*/
SLNode *p,*q;
int j;
p=head;
/*由于在链表中,第一个结点的位置为0,
所以,头结点的位置应为-1*/
j=-1;
/*查找i位置的前一个结点*/
while(p->next!=NULL && j<i-1 && p->next->next!=NULL)
{
p=p->next;
j++;
}
/*当j!=i-1 时,就没有找到*/
if(j!=i-1)
{
printf("The position inserted is ERROR in function ListDelete!\n");
return 0;
}
q=p->next; /*把i结点的地址存放在q所指的空间*/
*x=q->data; /*把要删除的i结点的数据域赋予x指向的地址*/
p->next=q->next; /*把i-1结点的next指针变量指向i+1结点*/
free(q); /*撤消q所指向的空间*/
return 1;
}
/*得到链表中,某个结点的数据域*/
int ListGet(SLNode *head,int i,DataType *x)
{
/*定义一个指向SLNode结构体的指针*/
SLNode *p;
int j;
p=head;
/*由于在链表中,第一个结点的位置为0,
所以,头结点的位置应为-1*/
j=-1;
/*查找i位置的结点*/
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
/*当j!=i 时,就没有找到*/
if(j!=i)
{
printf("The opsition inserted is ERROR in function ListGet!\n");
return 0;
}
/*把找到的结点的数据域赋予x所指向的空间*/
*x=p->data;
return 1;
}
/*撤消链表所申请的空间*/
void ListDestroy(SLNode **head)
{
SLNode *p,*q;
p=*head;
while(p!=NULL)
{
q=p; /*把p的值赋予q*/
p=p->next; /*指向下一个结点*/
free(q); /*撤消q所指向的空间*/
}
*head=NULL;
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
typedef struct /*定义结点数据域的类型*/
{
char StudentNum[5]; /*存放学生的学号*/
int SubScore[5]; /*存放学生的五门学科的得分*/
}DataType;
#include"LINLIST.H" /*包括,链表的所有操作的代码*/
int StudentBuild(SLNode **head); /*建立学生链表*/
int find(SLNode *head,char StudentNum[]); /*查找学生信息*/
int change(SLNode **head,char StudenNum[],char *Subject,int Score);/*修改学生信息*/
int add(SLNode **head,char StudentNum[],int Score[]); /*添加学生记录*/
int delete(SLNode **head,char StudentNum[]); /*删除学生记录*/
void list(SLNode *head); /*显示全部学生的信息*/
void dealWith(SLNode **head); /*消息处理*/
/*主函数*/
void main(void)
{
SLNode *head=NULL; /*定义一个头指针*/
FILE *fp1=NULL; /*定义二个文件类型的指针*/
FILE *fp=NULL;
int i=0; /*定义一个整型变量*/
DataType data; /*用来接收结点的数据域*/
char string[5];
ListInitiate(&head); /*初始化链表*/
if(StudentBuild(&head)==0) /*建立学生链表不成功*/
{
printf("Cannot build the listData of stduent\n");
free(head); /*撤消头指针指向的空间*/
getch(); /*暂停*/
exit(0); /*结束程序*/
}
dealWith(&head); /*进入消息处理函数*/
fp1=fopen("NUM.ZXF","w"); /*“NUM.ZXF”存放学生的总个数*/
itoa(ListLength(head),string,10);/*ListLength(head):得到结点的总个数。
itoa()作用就是把以10(代表整型)作为基数的(ListLength(head))转换成字符串类型
并把得到的字符串存放在string。*/
fprintf(fp1,"%s",string); /*以字符串的形式将string写入fp所指向的文件*/
/*更新"gidata.dat"文件*/
if((fp=fopen("gidata.dat","w"))==NULL) /*以建立一个文件的形式打开文件*/
{
printf("Cannot open file!\n");
}
/*把标题,写入到"gidata.dat"文件中并换行*/
fprintf(fp,"No Subject1 Subject2 Subject3 Subject4 Subject5 TotalScore\n");
/*把学生的学号和各科成绩及总成绩写入到文件当中*/
for(i=0;i<ListLength(head);i++)/*ListLength(*head)学生的总个数*/
{
ListGet(head,i,&data); /*从链表中得到学生信息,并存放在data变量中*/
/*把学生的学号和各科成绩写入到文件当中*/
fprintf(fp,"%s %d %d %d %d %d ",
data.StudentNum,
data.SubScore[0],
data.SubScore[1],
data.SubScore[2],
data.SubScore[3],
data.SubScore[4]);
/*把学生的总成绩写入到文件当中*/
fprintf(fp,"%d\n",(data.SubScore[0]
+data.SubScore[1]
+data.SubScore[2]
+data.SubScore[3]
+data.SubScore[4]));
}
fclose(fp); /*关闭文件*/
fclose(fp1); /*关闭文件*/
ListDestroy(&head); /*撤消链表所占的所有内存空间*/
}
/*添加学生记录,StudentNum存放学生的学号,
Score存放五门学科的成绩*/
int add(SLNode **head,char StudentNum[],int Score[])
{
/*定义指向SLNode结构体的指针变量,并赋予初值NULL*/
SLNode *p=NULL;
SLNode *s=NULL;
/*定义存放结构体的数据域的变量*/
DataType data;
int i=0; /*定义整型变量*/
p=(*head)->next; /*把链表的第一个结点的地址赋予p*/
/*查找是否有和传入的StudentNum相同的学号的学生记录*/
for(i=0;p!=NULL;i++)
{
if(strcmp(p->data.StudentNum,StudentNum)!=0)
{
p=p->next;
}
else
{
break;
}
}
/*p!=NULL表示有和StudentNum相同的学号的学生记录*/
if(p!=NULL)
{
printf("There is a Student Number ");
printf("which is the same as \" %s \"",StudentNum);
return 0; /*退出本函数,不进行下一步操作*/
}
/*没有和StudentNum相同的学号的学生记录*/
p=(*head); /*头结点指针赋予p*/
/*寻找合适的插入位置,并进行插入操作*/
while(p->next!=NULL)/*找到一个结点,插入的记录是在这个结点的后面*/
{
/*按从小到大的插入顺序查找*/
if(atoi(StudentNum)>atoi(p->next->data.StudentNum))
{
p=p->next;
}
else
{
break;
}
}
s=(SLNode*)malloc(sizeof(SLNode)); /*申请一个空间*/
/*将传入的学号和成绩添加上去*/
strcpy(s->data.StudentNum,StudentNum);
for(i=0;i<5;i++)
s->data.SubScore[i]=Score[i];
/*插入操作*/
s->next=p->next;
p->next=s;
return 1; /*返回1*/
}
/*修改学生记录,传入学号,学科名及其成绩*/
int change(SLNode **head,char StudentNum[],char Subject[],int Score)
{
SLNode *p=NULL; /*定义指向SLNode结构体的指针变量,并赋予初值NULL*/
int i=0; /*定义整型变量*/
DataType data; /*定义存放结构体的数据域的变量*/
p=(*head)->next; /*把链表的第一个结点的地址赋予p*/
/*查找是否有和传入的StudentNum相同的学号的学生记录*/
for(i=0;p!=NULL;i++)
{
if(strcmp(p->data.StudentNum,StudentNum)!=0)
{
p=p->next;
}
else
{
break;
}
}
/*p==NULL表示没有和StudentNum相同的学号的学生记录*/
if(p==NULL)
{
printf("There is not a student whose StudentNo is %s\n",StudentNum);
return 0; /*退出本函数,不进行下一步操作*/
}
/*传入的学科名与已知的学科名匹配,并相应地给学科成绩赋值*/
if(strcmp("Subject1",Subject)==0)
{
p->data.SubScore[0]=Score;
}
else if(strcmp("Subject2",Subject)==0)
{
p->data.SubScore[1]=Score;
}
else if(strcmp("Subject3",Subject)==0)
{
p->data.SubScore[2]=Score;
}
else if(strcmp("Subject4",Subject)==0)
{
p->data.SubScore[3]=Score;
}
else if(strcmp("Subject5",Subject)==0)
{
p->data.SubScore[4]=Score;
}
else /*没有匹配成功*/
{
printf("\" %s \" was out of law!\n",Subject);
return 0; /*退出本函数,不进行下一步操作*/
}
return 1; /*返回1*/
}
/*删除学生记录,传入学生学号*/
int delete(SLNode **head,char StudentNo[])
{
DataType data; /*定义存放结构体的数据域的变量*/
SLNode *p=NULL; /*定义指向SLNode结构体的指针变量,并赋予初值NULL*/
int i=0; /*定义整型变量*/
p=(*head)->next; /*把链表的第一个结点的地址赋予p*/
/*查找是否有和传入的StudentNo相同的学号的学生记录*/
for(i=0;p!=NULL;i++)
{
if(strcmp(p->data.StudentNum,StudentNo)!=0)
{
p=p->next;
}
else
{
break;
}
}
/*p!=NULL表示有和StudentNo相同的学号的学生记录*/
if(p!=NULL)
ListDelete(*head,i,&data);
else /*没有*/
{
printf("There is not a student whose StudentNo is %s\n",StudentNo);
return 0;
}
return 1;
}
void list(SLNode *head)
{
DataType data; /*定义存放结构体的数据域的变量*/
int i=0; /*定义整型变量*/
/*打印标题*/
printf("No Subject1 Subject2 Subject3 Subject4 Subject5 TotalScore\n");
/*打印学号,各学科成绩及总成绩*/
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&data); /*得到结点的数据域*/
/*打印学号和各学科成绩*/
printf("%s %d %d %d %d %d ",
data.StudentNum,
data.SubScore[0],
data.SubScore[1],
data.SubScore[2],
data.SubScore[3],
data.SubScore[4]);
/*打印总成绩*/
printf("%d\n",(data.SubScore[0]
+data.SubScore[1]
+data.SubScore[2]
+data.SubScore[3]
+data.SubScore[4]));
/*分批显示*/
if(i%20==0 && i!=0)
{
printf("\nPress any key to continue");
getch(); /*暂停*/
clrscr(); /*清屏*/
}
}
}
[此贴子已经被作者于2006-12-31 22:16:51编辑过]