数据结构实现2:单链表

/* Linear Table On Sequence Structure */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

/*---------page 10 on textbook ---------*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASTABLE -1
#define OVERFLOW -2

typedef int status;
typedef int ElemType; //数据元素类型定义

/*-------page 22 on textbook -------*/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT  10
typedef struct LNode {  //线性表(链表结构)的定义
	ElemType data;//数据域
	struct LNode* next;//指针域
}LNode, * LinkList;//分别表示链接结点结构体和对应指针
//十二种基本运算 
/*-----page 19 on textbook ---------*/
status InitList(LinkList& L);
status DestroyList(LinkList& L);
status ClearList(LinkList& L);
status ListEmpty(LinkList L);
int ListLength(LinkList L);
status GetElem(LinkList L, int i, ElemType& e);
status LocateElem(LinkList L, ElemType e);
status PriorElem(LinkList L, ElemType cur, ElemType& pre_e);
status NextElem(LinkList L, ElemType cur, ElemType& next_e);
status ListInsert(LinkList& L, int i, ElemType e);
status ListDelete(LinkList& L, int i, ElemType& e);
status ListTrabverse(LinkList L);
status SaveList(LinkList L, char* filename);
status LoadList(LinkList& L, char* filename);
/*--------------------------------------------*/
int main(void) {
	LinkList L=NULL;
	int flag=0, i, j, e;
	int cur, pre_e, next_e;
	int op = 1;
	while (op) {
		system("cls");	printf("\n\n");
		printf("      Menu for Linear Table On Sequence Structure \n");
		printf("-------------------------------------------------\n");
		printf("    	  1. InitList       8. PriorElem\n");
		printf("    	  2. DestroyList    9. NextElem \n");
		printf("    	  3. ClearList     10. ListInsert\n");
		printf("    	  4. ListEmpty     11. ListDelete\n");
		printf("    	  5. ListLength    12. ListTrabverse\n");
		printf("    	  6. GetElem       13.SaveList\n");
		printf("    	  7. LocateElem    14.LoadList\n         0. Exit\n");
		printf("-------------------------------------------------\n");
		printf("    请选择你的操作[0~14]:");
		scanf("%d", &op);
		switch (op) {
		case 1:
			//printf("\n----IntiList功能待实现!\n");
			if (flag) printf("线性表已存在!\n");
			else if (InitList(L) == OK) { printf("线性表创建成功!\n"); flag = 1; }
			else printf("线性表初始化失败!\n");
			getchar(); getchar();
			break;
		case 2:
			//printf("\n----DestroyList功能待实现!\n"); 
			if (!flag) printf("线性表L不存在!\n");
			else {
				if (DestroyList(L) == OK) { printf("线性表已销毁!\n"); flag = 0; }
				else printf("线性表销毁失败!\n");
			}
			getchar(); getchar();
			break;
		case 3:
			//printf("\n----ClearList功能待实现!\n");
			if (!flag) printf("线性表L不存在!\n");
			else {
				if (ClearList(L) == OK) printf("线性表已清空!\n");
				else printf("线性表清空失败!\n");
			}
			getchar(); getchar();
			break;
		case 4:
			//printf("\n----ListEmpty功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				if (ListEmpty(L)) printf("该线性表为空表!\n");
				else printf("该线性表不为空表!\n");
			}
			getchar(); getchar();
			break;
		case 5:
			//printf("\n----ListLength功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("该线性表表长为%d!\n", ListLength(L));
			}
			getchar(); getchar();
			break;
		case 6:
			//printf("\n----GetElem功能待实现!\n");
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("请输入要求得第几位数据?\n");
				scanf("%d", &i);
				if (GetElem(L, i, e) == ERROR) printf("输入数据超出范围!\n");
				if (GetElem(L, i, e)) printf("该线性表第%d个数据元素的值为%d!\n", i, GetElem(L, i, e));
			}
			getchar(); getchar();
			break;
		case 7:
			//printf("\n----LocateElem功能待实现!\n");
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("请输入你要查找的数据:\n");
				ElemType e;
				scanf("%d", &e);
				if (LocateElem(L, e)) printf("第一个与e相等的数据的位序为%d!\n", LocateElem(L, e));
				else printf("该线性表中不存在该数据!\n");
			}
			getchar(); getchar();
			break;
		case 8:
			//printf("\n----PriorElem功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("请输入一个数据!\n");
				scanf("%d", &cur);
				j = PriorElem(L, cur, pre_e);
				if (j == INFEASTABLE) printf("pre_e无定义!\n");
				else printf("%d的前驱为%d!", cur, j);
			}
			getchar(); getchar();
			break;
		case 9:
			//printf("\n----NextElem功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("请输入一个数据!\n");
				scanf("%d", &cur);
				j = NextElem(L, cur, next_e);
				if (j == INFEASTABLE) printf("next_e无定义!\n");
				else printf("%d的后继为%d!", cur, j);
			}
			getchar(); getchar();
			break;
		case 10:
			//printf("\n----ListInsert功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				int e;
				printf("请输入要插入的数据:");
				scanf("%d", &e);
				printf("请输入要将数据插在第几位?\n");
				scanf("%d", &i);
				if (ListInsert(L, i, e) == ERROR) printf("输入数据超出范围!\n");
				else printf("该数据已插入在线性表中!\n");
			}
			getchar(); getchar();
			break;
		case 11:
			//printf("\n----ListDelete功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				printf("请输入要删除的数据在第几位?\n");
				scanf("%d", &i);
				j = ListDelete(L, i, e);
				if (j == ERROR) printf("输入数据超出范围!\n");
				else printf("被删除的数据为%d!\n", j);
			}
			getchar(); getchar();
			break;
		case 12:
			//printf("\n----ListTrabverse功能待实现!\n");     
			if (!flag) printf("线性表L不存在!\n");
			else {
				if (!ListTrabverse(L)) printf("线性表是空表!\n");
			}
			getchar(); getchar();
			break;
		case 13:
			if (!flag) printf("线性表不存在!");
			else {
				printf("请输入保存到的文件名称,以.txt结尾\n");
				char filename[30];
				scanf("%s", filename);
				if (SaveList(L, filename) == ERROR) {
					printf("保存出错!\n");
				}
				else {
					printf("保存成功!\n");
				}
			}
			getchar(); getchar();
			break;
		case 14:
			if (!flag) printf("线性表不存在!\n");
			else {
				printf("请输入要加载的文件名称,以.txt结尾\n");
				char filename[30];
				scanf("%s", filename);
				if (LoadList(L, filename) == ERROR) {
					printf("文件读取错误!\n");
				}
				else {
					printf("文件读取成功!\n");
				}
			}
			getchar(); getchar();
			break;
		case 0:
			break;
		}//end of switch
	}//end of while
	printf("欢迎下次再使用本系统!\n");
	getchar(); getchar();
	return 0;
}//end of main()
//初始化表 

status InitList(LinkList& L) {//初始化链表,生成头结点
	L = (LNode*)malloc(sizeof(LNode));
	L->data = 0;//头结点数据域表示结点个数
	L->next = NULL;
	return OK;
}

status DestroyList(LinkList& L) {//销毁链表,逐个释放结点
	LinkList p;
	while (L != NULL) {
		p = L->next;
		free(L);
		L = p;
	}
	return OK;
}
status ClearList(LinkList& L) {//清空链表,只保留头结点
	LinkList p=L->next,q;
	while (p != NULL) {
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
	L->data = 0;
	return OK;
}
status ListEmpty(LinkList L) {//判断线性表是否为空表
	if (L->next) return false;
	return true;
}
int ListLength(LinkList L) {
	return L->data;
}
status GetElem(LinkList L, int i, ElemType& e) {//获得第i位元素
	if (i<1 || i>L->data) return ERROR;
	int j = 0;
	while (j < i) {
		L = L->next;
		j++;
	}
	e = L->data;
	return e;
}
status LocateElem(LinkList L, ElemType e) {//查找元素位置
	int j = 0;
	LinkList p = L->next;
	while (p != NULL) {
		j++;
		if (p->data == e) {
			return j;
		}
	}
	return ERROR;
}
status PriorElem(LinkList L, ElemType cur, ElemType& pre_e) {//查找前驱结点
	LinkList p = L->next,q;
	if (p == NULL) return INFEASTABLE;
	while (p->next != NULL) {
		q = p->next;
		if (q->data == cur) {
			pre_e = p->data;
			return pre_e;
		}
		p = q;
	}
	return INFEASTABLE;
}
status NextElem(LinkList L, ElemType cur, ElemType& next_e) {//查找后继结点
	LinkList p = L->next, q;
	if (p == NULL) return INFEASTABLE;
	while (p->next != NULL) {
		q = p->next;
		if (p->data == cur) {
			next_e = q->data;
			return next_e;
		}
	}
	return INFEASTABLE;
}
status ListInsert(LinkList& L, int i, ElemType e) {//在第i位插入结点
	if (i<1 || i>L->data+1) return ERROR;
	LinkList newNode = (LinkList)malloc(sizeof(LNode));//生成新节点
	int j = 0;
	LinkList p = L;
	while (j < i - 1) {//定位到第i-1个结点
		j++;
		p = p->next;
	}
	newNode->data = e;
	newNode->next = p->next;//新节点指向原来第i个结点
	p->next = newNode;
	L->data++;
	return OK;
}
status ListDelete(LinkList& L, int i, ElemType& e) {//删除结点
	if (i<1 || i>L->data) return ERROR;
	LinkList p = L, temp;
	int j = 0;
	while (j < i - 1) {//定位到第i-1个结点
		j++;
		p = p->next;
	}	
	temp = p->next;
	e = temp->data;
	p->next = temp->next;	
	free(temp);
	L->data--;	
	return OK;
}
status ListTrabverse(LinkList L) {//遍历链表
	printf("\n-----------all elements -----------------------\n");
	LNode* p;
	p = L->next;
	while (p) {
		printf("%d\t", p->data);
		p = p->next;
	}
	printf("\n------------------ end ------------------------\n");
	return L->data;
}
status SaveList(LinkList L, char* filename) {
	FILE* fp;
	if ((fp = fopen(filename, "wb")) == NULL) {
		printf("file open error!\n");
		return ERROR;
	}
	LNode* p; int i;
	p = L->next;
	for (i = 0; i < L->data; i++) {
		fwrite(&p->data, sizeof(ElemType), 1, fp);
		p = p->next;
	}
	fclose(fp);
	return OK;
}
status LoadList(LinkList& L, char* filename) {
	FILE* fp;
	if ((fp = fopen(filename, "rb")) == NULL) {
		printf("file open error!\n");
		return ERROR;
	}
	L->next = (LinkList)malloc(sizeof(LNode));
	LinkList p=L->next,q=p;
	while (fread(&p->data, sizeof(ElemType), 1, fp)) {
		p->next = (LinkList)malloc(sizeof(LNode));
		q = p;
		p = p->next;
		L->data++;
	}
	q->next = NULL;
	fclose(fp);
	return OK;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值