线性表的链式表示和实现

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

★结点类型和指针类型

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 0
typedef 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值