线性表的链式表示和实现

来源:互联网 发布:会计核算软件以模块 编辑:程序博客网 时间:2024/05/18 16:15

利用线性表的基本操作,实现学生成绩的插入、保存、删除、查找等操作的程序

★结点类型和指针类型

typedef struct Student

{

        charsno[20];

        int G;

}Student; 

typedef struct LinkNode

{

        DataTypedata;

        structLinkNode *next;

}LinkNode,*LinkList;


★本程序包含7个函数:

 ① 主函数main()

 ② 初始化线性表函数InitList()

 ③ 获取元素函数GetElem()

 ④ 插入元素函数ListInsert ()

 ⑤ 清空元素函数ClearListList()

 ⑥ 删除元素函数ListDelete()

 ⑦ 查找元素函数LocateElem() 


★使用说明:

save to file------(s)      保存到文件

insert into List--(i)       显示“输入学生的学号和成绩信息,用空格隔开”,-->要求输入要插入的位置和元素的值(都是整数)。

delete from List--(d)   要求输入要删除元素的位置,执行成功后返回元素的值。

clear List--------(c)       显示“LOCATE e = ”

print List--------(p)       输出已输入的学生学号和成绩信息

exit system-------(e)    退出程序



插入操作中依次输入123  89,234  9生成一个线性表

选择i:输入123,89,插入线性表。

选择i:输入234,95,插入线性表。

选择p:输出

学号 234,成绩95

学号 123,成绩89



#include <stdio.h>#include <string.h>#include <malloc.h>#include <windows.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status;typedef struct Student{char sno[20];//学号int G;//成绩}Student;char fileName[]="c:\\stu.txt";//数据结点定义typedef Student DataType;typedef struct LinkNode{DataType data;//学生struct LinkNode *next;}LinkNode,*LinkList;//初始化线性表操作//L:为所要初始化的线性表void InitList(LinkList &L){L=(LinkList)malloc(sizeof(LinkNode));L->data.G=0;L->next=NULL;}//获取元素操作,如果获取不成功,返回Error,否则返回OK//L:为所要操作的线性表//i:为所要获取的元素的位置//e:为返回所要获取的元素值Status GetElem(LinkList L,int i,DataType &e){if(i<1||i>L->data.G) return ERROR;LinkNode *p=L->next;for(int k=1;k<i;k++)p=p->next;e=p->data;return OK;}//把学生信息存储到文件的操作void savetoFile(LinkList L){Student e;FILE *f=fopen(fileName,"w");for(int k=0;k<L->data.G;k++){GetElem(L,k+1,e);fprintf(f,"%s %d\n",e.sno,e.G);}fclose(f);}//从控制台中输入一个学生信息bool readStudent(Student &e){printf("输入学生的学号和成绩信息,用空格隔开\n");scanf("%s %d",e.sno,&e.G);getchar();return TRUE;}//线性表插入操作//L:为所要操作的线性表//i:为要把元素插入到的位置//e:是所要插入的数据元素Status ListInsert(LinkList &L,int i,DataType e){LinkNode *p;LinkNode *q=L;int k=0;if(i>L->data.G+1||i<0) return FALSE;while(q && k<i-1){ q=q->next;k++;}if(!q ||k>i-1) return ERROR;p=(LinkList)malloc(sizeof(LinkNode));p->data=e;p->next=q->next;q->next=p;L->data.G++;return OK;}//线性表插入操作  -2-  在线性表头位置插入Status InsFirst(LinkList &L,DataType e){return ListInsert(L,1,e);//插入位置为1}//线性表插入操作  -3-  在线性表末尾位置插入Status InsLast(LinkList &L,DataType e){return ListInsert(L,L->data.G+1,e);//插入位置为L->data.G+1}//线性表清空操作//L:为所要清空的线性表Status ClearList(LinkList &L){LinkNode *p= L->next;while(p){L->next=p->next;delete p;p=L->next;}return OK;}//线性表删除操作,返回值为OK表示删除成功,否则不成功返回ERROR//L:为所要操作的线性表//i:为所要删除的元素位置//e:为返回所要删除的元素Status ListDelete(LinkList &L,int i,DataType &e){LinkNode *p=L,*q;if(i<1 ||i>L->data.G) return ERROR;for(int k=0;k<i-1;k++) p=p->next;q=p->next;p->next=q->next;delete q;return OK;}//定义学生结构体的遍历操作,简单的打印void visit(Student e){printf("学号:%s,成绩:%d\n",e.sno,e.G);}//遍历线性表//L:为所要遍历的线性表//visit:为遍历操作void ListTraverse(LinkList L,void(* visit)(DataType e)){LinkNode *p=L->next;while(p){visit(p->data);p=p->next;}}//定义学生信息结构体的比较函数bool compare(Student e1,Student e2){if(e1.G == e2.G && strcmp(e1.sno,e2.sno)) return 1;else return 0;}//查询线性表中元素存在与否,返回等于e的节点位置,不存在情况返回0//L:为要查询的线性表//e:为要查询的元素//compare:为查询操作所用的比较函数int LocateElem(LinkList L,DataType e, bool (*compare)(DataType,DataType)){LinkNode *p=L->next;int k=1;while(p)if((*compare)(p->data,e)) return k;else k++;return FALSE;}int main(){LinkList L;int pos;char command='\n';bool out=FALSE;char tmp[256];Student e;    InitList(L);while(!out){printf("||==========================||\n");printf("||                          ||\n");printf("||   save to file------(s)  ||\n");printf("||   insert into List--(i)  ||\n");printf("||   delete from List--(d)  ||\n");printf("||   clear List--------(c)  ||\n");printf("||   print List--------(p)  ||\n");printf("||   exit system-------(e)  ||\n");printf("||                          ||\n");printf("||==========================||\n");gets(tmp);command=tmp[0];switch(command){case 's':savetoFile(L);break;    case 'i':readStudent(e);printf("插入在第几个元素:");scanf("%d",&pos);ListInsert(L,pos,e);break;case 'c':ClearList(L);break;case 'd':ListDelete(L,2,e);break;case 'p':ListTraverse(L,visit);break;case 'e':out=TRUE;break;default:printf("error command \n");}system("pause");fflush(stdin);system("cls");}return 0; }





0 0
原创粉丝点击