文档库 最新最全的文档下载
当前位置:文档库 › 单链表的操作

单链表的操作

单链表的操作
单链表的操作

单链表的操作

本程序旨在使用设计的数据结构和算法实现单链表的初始化、删除、遍历、查找、插入、排序等基本操作。单链表的结点保存一个结构体信息(如学号、姓名、成绩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

相关文档