线性表的链式表示和实现
来源:互联网 发布:会计核算软件以模块 编辑:程序博客网 时间: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; }
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现
- 线性表的链式表示和实现(链式)
- 线性表的链式表示和实现----线性(单)链表
- 线性表得链式表示和实现
- MATLAB画阿基米德螺旋线
- 时间复杂度和空间复杂度
- Java进阶(十三)servlet监听器
- 畅通工程再续
- 深入理解Objective C的ARC机制
- 线性表的链式表示和实现
- Makefile学习笔记
- 队列写入mysql
- Groovy解析json
- 多线程串口通信
- Android中的JSON解析
- 题目1466:排列与二进制
- Android开发技巧之五分钟实现二维码识别(进阶版)
- epoll的LT,ET模式