/* 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;
}
数据结构实现2:单链表
最新推荐文章于 2022-11-21 18:26:33 发布