1.顺式线性表
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASTABLE -1
#define OVERFLOW -2
typedef int status;
typedef int ElemType; //数据元素类型定义
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct { //顺序表(顺序结构)的定义
ElemType* elem;
int length;
int listsize;
}SqList;
status InitList(SqList& L);
status DestroyList(SqList& L);
status ClearList(SqList&L);
status ListEmpty(SqList L);
int ListLength(SqList L);
status GetElem(SqList L,int i,ElemType& e);
int LocateElem(SqList L,ElemType e); //简化过
status PriorElem(SqList L,ElemType cur,ElemType&pre_e);
status NextElem(SqList L,ElemType cur,ElemType&next_e);
status ListInsert(SqList&L,int i,ElemType e);
status ListDelete(SqList& L, int i, ElemType& e);
status ListTrabverse(SqList L); //简化过
/*--------------------------------------------*/
void main(void) {
SqList L; int op = 1, i, r; ElemType e, p;
while (op) {
system("cls"); printf("\n\n");
printf(" Menu for Linear Table On Sequence Structure \n");
printf("-------------------------------------------------\n");
printf(" 1. InitList 7. LocateElem\n");
printf(" 2. DestroyList8. PriorElem\n");
printf(" 3. ClearList 9. NextElem \n");
printf(" 4. ListEmpty 10. ListInsert\n");
printf(" 5. ListLength 11. ListDelete\n");
printf(" 6. GetElem 12. ListTrabverse\n");
printf(" 0. Exit\n");
printf("-------------------------------------------------\n");
printf(" 请选择你的操作[0~12]:");
scanf("%d", &op);
switch (op) {
case 1:
//printf("\n----IntiList功能待实现!\n");
if (InitList(L) == OK) printf("线性表创建成功!\n");
else printf("线性表创建失败!\n");
getchar(); getchar();
break;
case 2:
//printf("\n----DestroyList功能待实现!\n");
if (DestroyList(L) == OK)printf("线性表销毁成功!\n");
else printf("线性表销毁失败!\n");
getchar(); getchar();
break;
case 3:
//printf("\n----ClearList功能待实现!\n");
if (ClearList(L) == OK)printf("线性表重置成功!\n");
else printf("线性表重置失败!\n");
getchar(); getchar();
break;
case 4:
//printf("\n----ListEmpty功能待实现!\n");
if (ListEmpty(L) == 1)printf("线性表为空!\n");
else if (ListEmpty(L) == 0)printf("线性表不为空!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 5:
//printf("\n----ListLength功能待实现!\n");
if (ListLength(L) >= 0)printf("线性表的长度为:%d\n", ListLength(L));
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 6:
//printf("\n----GetElem功能待实现!\n");
printf("请输入待取元素的索引:"); scanf("%d", &i); r = GetElem(L, i, e);
if (r == OK)printf("元素获取成功!\n");
else if (r == ERROR)printf("索引值越界!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 7:
//printf("\n----LocateElem功能待实现!\n");
printf("请输入想定位的元素:"); scanf("%d", &e);
if (LocateElem(L, e) > 0)printf("该元素位于第%d位。\n", LocateElem(L, e));
else if (LocateElem(L, e) == 0)printf("该元素不在线性表中!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 8:
//printf("\n----PriorElem功能待实现!\n");
printf("请输入一个元素:"); scanf("%d", &e);
if (PriorElem(L, e, p) == OK)printf("该元素的前驱元素为:%d\n", p);
else if (PriorElem(L, e, p) == ERROR)printf("该元素无前驱!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 9:
//printf("\n----NextElem功能待实现!\n");
printf("请输入一个元素:"); scanf("%d", &e);
if (NextElem(L, e, p) == OK)printf("该元素的后继元素为:%d\n", p);
else if (NextElem(L, e, p) == ERROR)printf("该元素无后继!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 10:
//printf("\n----ListInsert功能待实现!\n");
printf("请输入待插入的位置:待插入元素:"); scanf("%d %d", &i, &e); r = ListInsert(L, i, e);
if (r == OK)printf("元素插入成功!\n");
else if (r == ERROR)printf("索引值越界!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 11:
//printf("\n----ListDelete功能待实现!\n");
printf("请输入待删除元素的索引:"); scanf("%d", &i); r = ListDelete(L, i, e);
if (r == OK)printf("元素删除成功!\n");
else if (r == ERROR)printf("索引值越界!\n");
else printf("线性表不存在!\n");
getchar(); getchar();
break;
case 12:
//printf("\n----ListTrabverse功能待实现!\n");
if (!ListTrabverse(L)) printf("线性表是空表!\n");
getchar(); getchar();
break;
case 0:
break;
}//end of switch
}//end of while
printf("欢迎下次再使用本系统!\n");
}//end of main()
/*--------page 23 on textbook --------------------*/
status InitList(SqList& L) {
L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
status ListTrabverse(SqList L) {
int i;
printf("\n-----------all elements -----------------------\n");
for (i = 0; i < L.length; i++) printf("%d ", L.elem[i]);
printf("\n------------------ end ------------------------\n");
return L.length;
}
status DestroyList(SqList& L)
{
if (!L.elem)return INFEASTABLE;
free(L.elem);
L.elem = NULL;
L.length = 0;
L.listsize = 0;
return OK;
}
status ClearList(SqList& L)
{
if (L.elem)
{
L.length = 0;
return OK;
}
else return INFEASTABLE;
}
status ListEmpty(SqList L)
{
if (L.elem)
if (L.length != 0)return FALSE;
else return TRUE;
else return INFEASTABLE;
}
int ListLength(SqList L)
{
if (L.elem)return L.length;
else return INFEASTABLE;
}
status GetElem(SqList L, int i, ElemType& e)
{
if (!L.elem)return INFEASTABLE;
if (i <= 0 || i > L.length)return ERROR;
e = L.elem[i - 1];
return OK;
}
int LocateElem(SqList L, ElemType e)
{
if (!L.elem)return INFEASTABLE;
for (int i = 0; i < L.length; ++i)
if (e == L.elem[i])return i + 1;
return 0;
}
status PriorElem(SqList L, ElemType e, ElemType& pre)
{
if (!L.elem)return INFEASTABLE;
for (int i = 0; i < L.length; ++i)
{
if (e == L.elem[i] && i == 0)return ERROR;
else if (e == L.elem[i])
{
pre = L.elem[i - 1];
return OK;
}
}
return ERROR;
}
status NextElem(SqList L, ElemType e, ElemType& next)
{
if (!L.elem)return INFEASTABLE;
for (int i = 0; i < L.length - 1; ++i)
if (e == L.elem[i])
{
next = L.elem[i + 1];
return OK;
}
return ERROR;
}
status ListInsert(SqList& L, int i, ElemType e)
{
ElemType* newbase;
int* q, * p;
if (!L.elem)return INFEASTABLE;
if (i<1 || i>L.length + 1)return ERROR;
if (L.length >= L.listsize)
{
newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newbase)return ERROR;
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i - 1]);
for (p = &(L.elem[L.length - 1]); p >= q; --p)*(p + 1) = *p;
*q = e;
++L.length;
return OK;
}
status ListDelete(SqList& L, int i, ElemType& e)
{
if (!L.elem)return INFEASTABLE;
if (i<1 || i>L.length)return ERROR;
int* q, * p;
e = L.elem[i - 1];
p = &(L.elem[i - 1]), q = L.elem + L.length - 1;
for (; p < q; ++p)*p = *(p + 1);
--L.length;
return OK;
}
2.链式线性表
#define _CRT_SECURE_NO_WARNINGS
/* Linear Table On Sequence Structure */
#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 INFEASIBLE -1
#define OVERFLOW -2
typedef int status;
typedef int ElemType; //数据元素类型定义
/*-------page 22 on textbook -------*/
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct LNode { //单链表(链式结构)结点的定义
ElemType data;
struct LNode* next;
}LNode, * LinkList;
/*-----page 19 on textbook ---------*/
status InitLinkList(LinkList& L);
status DestroyLinkList(LinkList& L);
status ClearLinkList(LinkList& L);
status LinkListEmpty(LinkList L);
int LinkListLength(LinkList L);
status GetElem(LinkList L, int i, ElemType& e);
int LocateElem(LinkList L, ElemType e);
status PriorElem(LinkList L, ElemType e, ElemType& pre);
status NextElem(LinkList L, ElemType e, ElemType& next);
status LinkListInsert(LinkList& L, int i, ElemType e);
status LinkListDelete(LinkList& L, int i, ElemType& e);
status LinkListTraverse(LinkList L);
/*--------------------------------------------*/
int main(void) {
LinkList L = NULL; int op = 1, i, r; ElemType e, p;
while (op) {
system("cls"); printf("\n\n");
printf(" Menu for Linear Table On Sequence Structure \n");
printf("-------------------------------------------------\n");
printf(" 1. InitLinkList 7. LocateElem\n");
printf(" 2. DestroyLinkList 8. PriorElem\n");
printf(" 3. ClearLinkList 9. NextElem \n");
printf(" 4. LinkListEmpty 10. LinkListInsert\n");
printf(" 5. LinkListLength 11. LinkListDelete\n");
printf(" 6. GetElem 12. LinkListTrabverse\n");
printf(" 0. Exit\n");
printf("-------------------------------------------------\n");
printf(" 请选择你的操作[0~12]:");
scanf("%d", &op);
switch (op) {
case 1:
if (InitLinkList(L) == OK) printf("链表创建成功!\n");
else printf("链表创建失败!\n");
getchar(); getchar();
break;
case 2:
if (DestroyLinkList(L) == OK)printf("链表销毁成功!\n");
else printf("链表销毁失败!\n");
getchar(); getchar();
break;
case 3:
if (ClearLinkList(L) == OK)printf("链表重置成功!\n");
else printf("链表重置失败!\n");
getchar(); getchar();
break;
case 4:
if (LinkListEmpty(L) == 1)printf("链表为空!\n");
else if (LinkListEmpty(L) == 0)printf("链表不为空!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 5:
if (LinkListLength(L) >= 0)printf("链表的长度为:%d\n", LinkListLength(L));
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 6:
printf("请输入待取元素的索引:"); scanf("%d", &i); r = GetElem(L, i, e);
if (r == OK)printf("元素%d获取成功!\n", e);
else if (r == ERROR)printf("索引值越界!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 7:
printf("请输入想定位的元素:"); scanf("%d", &e);
if (LocateElem(L, e) > 0)printf("该元素位于第%d位。\n", LocateElem(L, e));
else if (LocateElem(L, e) == 0)printf("该元素不在链表中!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 8:
printf("请输入一个元素:"); scanf("%d", &e);
if (PriorElem(L, e, p) == OK)printf("该元素的前驱元素为:%d\n", p);
else if (PriorElem(L, e, p) == ERROR)printf("该元素无前驱!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 9:
printf("请输入一个元素:"); scanf("%d", &e);
if (NextElem(L, e, p) == OK)printf("该元素的后继元素为:%d\n", p);
else if (NextElem(L, e, p) == ERROR)printf("该元素无后继!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 10:
printf("请输入待插入的位置:待插入元素:"); scanf("%d %d", &i, &e); r = LinkListInsert(L, i, e);
if (r == OK)printf("元素插入成功!\n");
else if (r == ERROR)printf("索引值越界!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 11:
printf("请输入待删除元素的索引:"); scanf("%d", &i); r = LinkListDelete(L, i, e);
if (r == OK)printf("元素删除成功!\n");
else if (r == ERROR)printf("索引值越界!\n");
else printf("链表不存在!\n");
getchar(); getchar();
break;
case 12:
if (!LinkListTraverse(L)) printf("链表是空表!\n");
getchar(); getchar();
break;
case 0:
break;
}//end of switch
}//end of while
printf("欢迎下次再使用本系统!\n");
return 0;
}//end of main()
/*--------page 23 on textbook --------------------*/
status InitLinkList(LinkList& L)
{
if (L)return INFEASIBLE;
else
{
LinkList p = (LinkList)malloc(sizeof(LNode));
p->next = NULL;
L = p;
return OK;
}
}
status LinkListTraverse(LinkList L)
{
if (!L)return INFEASIBLE;
else
{
if (!L->next)return OK;
L = L->next;
printf("-------------------------------------------------\n");
while (L->next)
{
printf("%d ", L->data);
L = L->next;
}
printf("%d\n", L->data);
printf("-------------------------------------------------\n");
return OK;
}
}
status DestroyLinkList(LinkList& L)
{
if (!L)return INFEASIBLE;
else
{
LNode* p = L;
while (p)
{
p = L->next;
free(L);
L = p;
}
return OK;
}
}
status ClearLinkList(LinkList& L)
{
if (!L)return INFEASIBLE;
else
{
LNode* tail = L->next, * p = tail->next;
while (p)
{
free(tail);
tail = p;
p = p->next;
}
free(tail);
L->next = NULL;
return OK;
}
}
status LinkListEmpty(LinkList L)
{
if (!L)return INFEASIBLE;
else if (L->next == NULL)return TRUE;
else return FALSE;
}
int LinkListLength(LinkList L)
{
if (!L)return INFEASIBLE;
else
{
int count = 0;
LNode* p = L->next;
while (p)
{
++count;
p = p->next;
}
return count;
}
}
status GetElem(LinkList L, int i, ElemType& e)
{
if (!L)return INFEASIBLE;
else if (i <= 0)return ERROR;
else
{
LNode* p = L;
for (int j = 1; j <= i; ++j)
{
if (!p->next)return ERROR;
p = p->next;
}
e = p->data;
return OK;
}
}
int LocateElem(LinkList L, ElemType e)
{
if (!L)return INFEASIBLE;
else
{
LNode* p = L->next;
for (int i = 1; p; ++i)
{
if (p->data == e)return i;
p = p->next;
}
return ERROR;
}
}
status PriorElem(LinkList L, ElemType e, ElemType& pre)
{
if (!L)return INFEASIBLE;
else
{
if (!L->next || !L->next->next)return ERROR;
LNode* p = L->next, * tail = p->next;
while (tail)
{
if (tail->data == e)
{
pre = p->data;
return OK;
}
p = tail, tail = tail->next;
}
return ERROR;
}
}
status NextElem(LinkList L, ElemType e, ElemType& next)
{
if (!L)return INFEASIBLE;
else
{
if (!L->next || !L->next->next)return ERROR;
LNode* p = L->next, * tail = p->next;
while (tail)
{
if (p->data == e)
{
next = tail->data;
return OK;
}
p = tail, tail = tail->next;
}
return ERROR;
}
}
status LinkListInsert(LinkList& L, int i, ElemType e)
{
if (!L)return INFEASIBLE;
else if (i <= 0)return ERROR;
else
{
LNode* p = L;
for (int j = 1; j < i && p; ++j)p = p->next;
if (!p)return ERROR;
LNode* temp = (LNode*)malloc(sizeof(LNode));
temp->data = e, temp->next = p->next;
p->next = temp;
return OK;
}
}
status LinkListDelete(LinkList& L, int i, ElemType& e)
{
if (!L)return INFEASIBLE;
else if (i <= 0)return ERROR;
else
{
LNode* p = L;
for (int j = 1; j < i && p; ++j)
{
p = p->next;
}
if (!p || !p->next)return ERROR;
e = p->next->data;
LNode* temp = p->next->next;
free(p->next);
p->next = temp;
return OK;
}
}