单链表的操作
本程序旨在使用设计的数据结构和算法实现单链表的初始化、删除、遍历、查找、插入、排序等基本操作。单链表的结点保存一个结构体信息(如学号、姓名、成绩1、成绩2、总成绩)。测试平台:VC++6.0。
/************main.c**********/
#include
#include
#include
#include
#include"Linklist.h"
/*-----------------------------------主函数----------------------------------*/
void main(void)
{
FILE *fp;
PLinklist h=NULL, last = NULL, head=NULL;
StuDent rst;
int total,pos;
char keybuf,flag;
Init_Linklist(&h);//初始化
last = h;
/* Open file for input: */
system("color 4F"); //背景颜色
/*用system("color 0A"); 其中color后面的0是背景色代号,A是前景色代号。各颜色代码如下:
0=黑色1=蓝色2=绿色3=湖蓝色4=红色5=紫色6=黄色7=白色
8=灰色9=淡蓝色A=淡绿色B=淡浅绿色C=淡红色D=淡紫色E=淡黄色F=亮白色*/ system("pause"); //按任意键开始
if((fp=fopen("Score.txt","r"))==NULL)
{
perror("fopen error"); //读文件出错,退出
exit(-1);
}
while(1)
{
if(fgets(buf,256,fp)==NULL)
break; //-->文件已经读空, 退出读循环
sscanf(buf, "%s %s %d %d %d",rst.sid , https://www.wendangku.net/doc/6f17477812.html, , &rst.sc1 , &rst.sc2 ,&rst.sc3 );//从一个字符串
中读进与指定格式相符的数据
printf("Read: [%s] \n",buf);
printf("Data[%s %s %d %d %d]\n",rst.sid , https://www.wendangku.net/doc/6f17477812.html, , rst.sc1 , rst.sc2 ,rst.sc3);
Read_Linklist(&last,rst);
printf("Tweaverse: \n");
Traverse_Linklist(h);
total=Length_Linklist(h);
printf("%d\n",total);
}
fclose(fp); //读文件操作结束,关闭文件
while(1)
{
system("pause");//暂停
system("cls"); //清屏
printf(" ************************** \n"); printf(" * 链表操作* \n"); printf(" ************************** \n"); printf("—————————————————主菜单——————————————————\n"); printf(" ********** S__遍历:********* \n"); printf(" ********** I__插入:********* \n"); printf(" ********** D__删除结点:********* \n"); printf(" ********** F__查找内容:********* \n"); printf(" ********** L__查看结点数:********* \n"); printf(" ********** Q__写入文件并退出:********* \n"); printf(" ********** B__排序(升序):********* \n"); fflush(stdin); //清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件
printf("——————————————————————————————————————\n"); printf(" 请你选择操作编号:\n");
printf(" -->");
keybuf=getchar();
switch(keybuf)
{
case 'S':
Traverse_Linklist(h);
break;
case 'D':
printf(" 请选择您删除的结点:\n");
printf(" -->");
scanf("%d",&pos);
Delete_Linklist(h, pos);
break;
case 'L':
printf(" 链表长度为:\n");
total=Length_Linklist(h);
printf(" %d\n",total);
break;
case 'Q':
File_Linklist(h);//写入文件
exit(1);
case 'I':
printf(" 请输入要插入的结点!\n");
printf(" ");
scanf("%d",&pos);
printf(" 请输入要插入的内容!\n");
printf(" ");
scanf("%s %s %d %d %d",rst.sid , https://www.wendangku.net/doc/6f17477812.html, , &rst.sc1 , &rst.sc2 ,&rst.sc3 );
Insert_Linklist(h, pos, rst);
break;
case 'F':
printf(" 请输入您要查找的总成绩:\n");
printf(" -->");
scanf("%d",&pos);
head=Find_Linklist(h,pos);
printf("-----------------------------查找结果如下:-------------------------\n");
printf(" 学号:%s 姓名:%s 理论:%d 实验:%d 总成绩:%d\n",head->st.sid, head->https://www.wendangku.net/doc/6f17477812.html,,head->st.sc1,head->st.sc2,head->st.sc3);
break;
case 'B':
printf("-----------------------------排序结果如下:-------------------------\n");
Linklist_bubbleSort(h);
Traverse_Linklist(h);
break;
default:
printf(" **************** 输入操作编号错误!*****************\n"); break;
}
printf("\n 是否继续操作?Y/N:\n
-->");
getchar();
scanf("%c", &flag);
if(flag != 'Y' && flag != 'y')
{
exit(0);
}
}
}
/************Linklist.c*********/
#include
#include
#include
#include
#include"Linklist.h"
/*------------------------------------------子函数---------------------------------------------*/
int Init_Linklist(PLinklist *head) //初始化单链表
{
*head=(PLinklist)malloc(sizeof(LNode));//分配动态空间
if(!head)
{
printf("初始化链表错误!\n");
return 0;
}
(*head)->next =NULL;//头结点的指针域置为空
return 1;
}
int Read_Linklist(PLinklist *last, StuDent st)//将内容写入单链表
{
PLinklist pnewnode = NULL;
pnewnode=(PLinklist)malloc(sizeof(LNode));
if(!pnewnode)
{
printf("无法生成新结点!\n");
return 0;
}
strcpy(pnewnode->st.sid, st.sid );
strcpy(pnewnode->https://www.wendangku.net/doc/6f17477812.html, , https://www.wendangku.net/doc/6f17477812.html,);
pnewnode->st.sc1 = st.sc1 ;
pnewnode->st.sc2 = st.sc2 ;
pnewnode->st.sc3 = st.sc3 ;
pnewnode->next = (*last)->next;
(*last)->next = pnewnode;
(*last) = pnewnode;
return 1;
}
void Traverse_Linklist(PLinklist head) //遍历单链表
{
PNode p=head->next;
printf("[**编号**][**学号**][**姓名**][**理论**][**实验**][**总成绩**]\n"); while(p)
{
printf("%s %s %d %d %d \n",
p->st.sid,p->https://www.wendangku.net/doc/6f17477812.html,,p->st.sc1,p->st.sc2,p->st.sc3);
p=p->next;
}
printf("\n");
}
int Length_Linklist(PLinklist head)//计算长度
{
int total = 0;
PLinklist p=head->next;
while(p)
{
total++;
p=p->next;
}
return total;
}
void Delete_Linklist(PLinklist head, int pos)//删除
{
PNode p = head,q;
int i;
for (i=0;i { p=p->next; } q=p->next->next; p->next=q->next; free(q); } PLinklist Find_Linklist(PLinklist head,int sco3)//按总成绩查找{ PNode p=head->next; while(p && p->st.sc3 != sco3) { p=p->next; } return p; } void Insert_Linklist(PLinklist head, int pos, StuDent stu)//插入{ PNode p=head,q; int i=0; while(p && i { p=p->next; i++; } if(!p || i { printf("插入位置不合法!\n"); } q = (PNode)malloc(sizeof(LNode));//生成新结点 if(!q) { printf("不能生成新结点!\n"); } q->st=stu;//给新结点赋值 q->next = p->next; p->next=q; } void File_Linklist(PNode head)//写入文件 { PNode p=head->next; FILE *fp; fp=fopen("Score1.txt","w"); while (p->next != NULL) { fprintf(fp,"%s %s %d %d %d \n", p->st.sid,p->https://www.wendangku.net/doc/6f17477812.html,,p->st.sc1,p->st.sc2,p->st.sc3); p=p->next; } fclose(fp); } void Linklist_bubbleSort(PLinklist head)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/ { PLinklist p,q; char xm[225], xh[225]; int sco1,sco2,sco3; for(p=head->next;p!=NULL;p=p->next) { for(q=p->next;q!=NULL;q=q->next) { if(p->st.sc3>q->st.sc3) { strcpy(xh,p->st.sid); strcpy(p->st.sid ,q->st.sid); strcpy(q->st.sid,xh); strcpy(xm,p->https://www.wendangku.net/doc/6f17477812.html,); strcpy(p->https://www.wendangku.net/doc/6f17477812.html,,q->https://www.wendangku.net/doc/6f17477812.html,); strcpy(q->https://www.wendangku.net/doc/6f17477812.html,,xm); sco1=p->st.sc1 ; p->st.sc1= q->st.sc1 ; q->st.sc1 = sco1; sco2 =p->st.sc2 ; p->st.sc2= q->st.sc2 ; q->st.sc2 = sco2 ; sco3=p->st.sc3 ; p->st.sc3= q->st.sc3 ; q->st.sc3 =sco3 ; } } } } /************Linklist.h*********/ #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef struct { char sid[255];//学号 char name[255]; int sc1; int sc2; int sc3; }StuDent; typedef struct Node { StuDent st; struct Node *next; }*PLinklist,LNode,*PNode; int Init_Linklist(PLinklist *head);//初始化 int Read_Linklist(PLinklist *last, StuDent st);//写入内容void Traverse_Linklist(PLinklist head);//遍历 int Length_Linklist(PLinklist head);//计算长度 void Delete_Linklist(PLinklist head, int pos);//删除PLinklist Find_Linklist(PLinklist head,int sco3);//查找void Insert_Linklist(PLinklist head, int pos, StuDent stu); void File_Linklist(PNode head);//写入文件 void Linklist_bubbleSort(PLinklist head); char buf[60000]; #endif