#ifndef XXB_H
#define XXB_H
#include"Head.h"
#define LIST_INT_SIZE 10000//表长
#define LISTINCREMENT 1000//表增量
//数据结构
//线性表顺序表示
typedef struct {
ElemType_Int* elem; //存储空间基址
int length; //当前长度
int listsize; //最大长度
}SqList;
//链式表示
//不带头结点的单链表
typedef struct LNode {
ElemType_Int data; //数据域
struct LNode* next; //后继结点
}LNode, * LinkList;
//带头结点的单链表
typedef struct HLNode {
ElemType_Int data;
struct HLNode* next;
}HLNode, * HLink;
typedef struct {
HLink head, tail;//指向头结点和最后一个结点
int length;//链表中元素个数
}HLinkList;
//不带头结点的双向循环链表
typedef struct DuNode {
ElemType_Int data;
struct DuNode* prior, * next;//前驱和后继
}DuNode, * DuLinkList;
//多项式
typedef struct {
int coef;
int exp;
}PolyTerm;
typedef struct {
PolyTerm* data;
int length;
}SqPoly;
typedef struct PolyNode {
PolyTerm data;
struct PolyNode* next;
}PolyNode, * PolyLink;
typedef PolyLink LinkedPoly;
//函数声明
//初始化
Status InitSqList(SqList* L);
Status InitLinkList(LinkList* L);
Status InitHLinkList(HLinkList* L);
Status InitDuLinkList(DuLinkList* L);
//销毁
Status Destory_SqList(SqList* L);
Status Destory_LinkList(LinkList* L);
Status Destory_HLinkList(HLinkList* L);
Status Destory_DuLinkList(DuLinkList* L);
//探空
Status Empty_SqList(SqList L);
Status Empty_LinkList(LinkList L);
Status Empty_HLinkList(HLinkList L);
Status Empty_DuLinkList(DuLinkList L);
//求元素个数
int Length_SqList(SqList L);
int Length_LinkList(LinkList L);
int Length_HLinkList(HLinkList L);
int Length_DuLinkList(DuLinkList L);
//获取第i个元素的值
ElemType_Int GetElem_SqList(SqList L, int i);
ElemType_Int GetElem_LinkList(LinkList L, int i);
ElemType_Int GetElem_HLinkList(HLinkList L, int i);
ElemType_Int GetElem_DuLinkList(DuLinkList L, int i);
//求第一个与e满足关系compare()的数据的位序
Status compare(ElemType_Int a, ElemType_Int b, char* s);
int Locate_SqList(SqList L, ElemType_Int e, char* s);
int Locate_LinkList(LinkList L, ElemType_Int e, char* s);
int Locate_HLinkList(HLinkList L, ElemType_Int e, char* s);
int Locate_DuLinkList(DuLinkList L, ElemType_Int e, char* s);
//求前驱
Status Prior_LinkList(LinkList L, LNode cur_e, LinkList pre_e);
Status Prior_HLinkList(HLinkList L, HLNode cur_e, HLink pre_e);
//求后继
Status Next_LinkList(LinkList L, LNode cur_e, LinkList next_e);
Status Next_HLinkList(HLinkList L, HLNode cur_e, HLink next_e);
//在第i个位置之前插入e,若i大于线性表中元素个数,则在最后插入
Status Insert_SqList(SqList* L, ElemType_Int e, int i);
Status Insert_LinkList(LinkList* L, ElemType_Int e, int i);
Status Insert_HLinkList(HLinkList* L, ElemType_Int e, int i);
Status Insert_DuLinkList(DuLinkList* L, ElemType_Int e, int i);
//若第i个元素存在,删除它,并用e返回
Status Delete_SqList(SqList* L, ElemType_Int* e, int i);
Status Delete_LinkList(LinkList* L, ElemType_Int* e, int i);
Status Delete_HLinkList(HLinkList* L, ElemType_Int* e, int i);
Status Delete_DuLinkList(DuLinkList* L, ElemType_Int* e, int i);
//复制L
Status Copy_SqList(SqList L, SqList* Q);
//打印输出
//从0号位输出
void OutPutSqList(SqList L);
//0号位不输出
void OutPutSqList_1(SqList L);
void OutPutLinkList(LinkList L);
void OutPutHLinkList(HLinkList L);
void OutPutDuLinkList(DuLinkList L);
#endif // !XXB_H
#ifndef XXB_C
#define XXB_C
#include"List.h"
//初始化
Status InitSqList(SqList* L) {
(*L).elem = (ElemType_Int*)malloc(LIST_INT_SIZE * sizeof(ElemType_Int));
(*L).length = 0;
(*L).listsize = LIST_INT_SIZE;
return OK;
}
Status InitLinkList(LinkList* L) {
*L = NULL;
return OK;
}
Status InitHLinkList(HLinkList* L) {
(*L).head = MALLOC(1, HLNode);
(*L).tail = (*L).head;
(*L).head->next = NULL;
(*L).length = 0;
return OK;
}
Status InitDuLinkList(DuLinkList* L) {
*L = NULL;
return OK;
}
//销毁
Status Destory_SqList(SqList* L) {
free((*L).elem);
(*L).elem = NULL;
(*L).length = 0;
return OK;
}
Status Destory_LinkList(LinkList* L) {
LinkList p, q;
p = *L;
q = p;
while (q) {
q = p->next;
free(p);
p = q;
}
free(p);
L = NULL;
return OK;
}
Status Destory_HLinkList(HLinkList* L) {
HLink p, q;
p = (*L).head->next;
q = p;
while (q) {
q = p->next;
free(p);
p = q;
}
free(p);
free((*L).head);
(*L).head = NULL;
(*L).tail = (*L).head;
(*L).length = 0;
return OK;
}
Status Destory_DuLinkList(DuLinkList* L) {
DuLinkList p, q;
p = *L;
q = p;
while (q->next != *L) {
q = p->next;
free(p);
p = q;
}
free(p);
L = NULL;
return OK;
}
//清空
Status Clear_SqList(SqList* L) {
(*L).length = 0;
return OK;
}
Status Clear_LinkList(LinkList* L) {
L = NULL;
return OK;
}
Status Clear_HLinkList(HLinkList* L) {
(*L).head->next = NULL;
(*L).tail = (*L).head;
(*L).length = 0;
return OK;
}
Status Clear_DuLinkList(DuLinkList* L) {
L = NULL;
return OK;
}
//探空
Status Empty_SqList(SqList L) {
return !L.length ? OK : ERROR;
}
Status Empty_LinkList(LinkList L) {
return !L ? OK : ERROR;
}
Status Empty_HLinkList(HLinkList L) {
return L.head == L.tail ? OK : ERROR;
}
Status Empty_DuLinkList(DuLinkList L) {
return !L ? OK : ERROR;
}
//求元素个数
int Length_SqList(SqList L) {
return L.length;
}
int Length_LinkList(LinkList L) {
LinkList p;
int count;
for (p = L, count = 0; p; p = p->next, count++);
return count;
}
int Length_HLinkList(HLinkList L) {
return L.length;
}
int Length_DuLinkList(DuLinkList L) {
DuLinkList p;
int count;
for (p = L, count = 0; p->next != L; p = p->next, count++);
return ++count;
}
//获取第i个元素的值
ElemType_Int GetElem_SqList(SqList L, int i) {
if (i > L.length) {
printf("there are only %d elements in the list\n", L.length);
return 0;
}
return L.elem[i - 1];
}
ElemType_Int GetElem_LinkList(LinkList L, int i) {
int count;
LinkList p;
for (p = L, count = 0; p && count < i - 1; p = p->next, count++);
if (!p && count == i - 1) {
printf("there are only %d elements in the list\n", count);
return 0;
}
return p->data;
}
ElemType_Int GetElem_HLinkList(HLinkList L, int i) {
int count;
HLink p;
for (p = L.head->next, count = 0; p && count < i - 1; p = p->next, count++);
if (!p && count == i - 1) {
printf("there are only %d elements in the list\n", count);
return 0;
}
return p->data;
}
ElemType_Int GetElem_DuLinkList(DuLinkList L, int i) {
int count;
DuLinkList p = L;
if (i == 1)
return p->data;
for (p = p->next, count = 2; p != L && count != i; p = p->next, count++);
if (p == L) {
printf("there are only %d elements in the list\n", count);
return 0;
}
return p->data;
}
//求第一个与e满足关系compare()的数据的位序
Status compare(ElemType_Int a, ElemType_Int b, char* s) {
if (!strcmp(s, "<")) {
if (a < b)
return OK;
}
else if (!strcmp(s, "<=")) {
if (a <= b)
return OK;
}
else if (!strcmp(s, "=")) {
if (a == b)
return OK;
}
else if (!strcmp(s, ">")) {
if (a > b)
return OK;
}
else if (!strcmp(s, ">=")) {
if (a >= b)
return OK;
}
return ERROR;
}
int Locate_SqList(SqList L, ElemType_Int e, char* s) {
int pos = 1;
while (!compare(L.elem[pos], e, s) && pos < L.length)
pos++;
if (!compare(L.elem[pos], e, s) && pos == L.length)
return 0;
else
return pos;
}
int Locate_LinkList(LinkList L, ElemType_Int e, char* s) {
int pos = 1;
LinkList p = L;
while (p&&!compare(p->data, e, s))
pos++;
if (!p || (p && !compare(p->data, e, s)))
return 0;
else
return pos;
}
int Locate_HLinkList(HLinkList L, ElemType_Int e, char* s) {
int pos = 1;
HLink p = L.head->next;
while (p && !compare(p->data, e, s))
pos++;
if (!p || (p && !compare(p->data, e, s)))
return 0;
else
return pos;
}
int Locate_DuLinkList(DuLinkList L, ElemType_Int e, char* s) {
DuLinkList p = L;
if (compare(p->data, e, s))
return 1;
int pos = 2;
p = p->next;
while (p!= L && !compare(p->data, e, s)) {
p = p->next;
pos++;
}
if (p == L)
return 0;
else
return pos;
}
//求前驱
Status Prior_LinkList(LinkList L,LNode cur_e,LinkList pre_e){
LinkList p, q;
p = L;
if (p->data == cur_e.data)
return ERROR;
q = p->next;
while (q) {
if (q->data == cur_e.data)
break;
p = q;
q = q->next;
}
if (!q)
return ERROR;
pre_e = p;
return OK;
}
Status Prior_HLinkList(HLinkList L, HLNode cur_e, HLink pre_e) {
HLink p, q;
p = L.head->next;
if (p->data == cur_e.data)
return ERROR;
q = p->next;
while (q) {
if (q->data == cur_e.data)
break;
p = q;
q = q->next;
}
if (!q)
return ERROR;
pre_e = p;
return OK;
}
//求后继
Status Next_LinkList(LinkList L, LNode cur_e, LinkList next_e) {
LinkList p, q;
p = L;
q = p->next;
while (q) {
if (p->data == cur_e.data)
break;
p = q;
q = q->next;
}
if (!q)
return ERROR;
next_e = p;
return OK;
}
Status Next_HLinkList(HLinkList L, HLNode cur_e, HLink next_e) {
HLink p, q;
p = L.head->next;
q = p->next;
while (q) {
if (p->data == cur_e.data)
break;
p = q;
q = q->next;
}
if (!q)
return ERROR;
next_e = p;
return OK;
}
//在第i个位置之前插入e,若i大于线性表中元素个数,则在最后插入
Status Insert_SqList(SqList* L, ElemType_Int e, int i) {
if ((*L).length == (*L).listsize) {
(*L).elem = REALLOC((*L).elem, ((*L).length + LISTINCREMENT),ElemType_Int);
(*L).listsize += LISTINCREMENT;
}
if (i > (*L).length) {
(*L).elem[++(*L).length - 1] = e;
return OK;
}
int j;
for (j = (*L).length - 1; j >= i - 1; j--)
(*L).elem[j + 1] = (*L).elem[j];
(*L).elem[i - 1] = e;
(*L).length++;
return OK;
}
Status Insert_LinkList(LinkList* L, ElemType_Int e, int i) {
int count;
LinkList p, q, t;
t = MALLOC(1, LNode);
t->data = e;
t->next = NULL;
if (!(*L))
*L = t;
else {
for (p = *L, q = p, count = 0; p && count < i - 1; count++, q = p, p = p->next);
if (p == *L) {
t->next = *L;
*L = t;
return OK;
}
t->next = p;
q->next = t;
}
return OK;
}
Status Insert_HLinkList(HLinkList* L, ElemType_Int e, int i) {
HLink p, q, t;
int count;
t = MALLOC(1, HLNode);
t->data = e;
if ((*L).length < i) {//是否插在最后
t->next = NULL;
(*L).tail->next = t;
(*L).tail = t;
return OK;
}
for (p = (*L).head, q = p, count = 0; p && count < i - 1; count++, q = p, p = p->next);
if (p == q) {
t->next = p->next;
p->next = t;
return OK;
}
t->next = q;
p->next = t;
return OK;
}
Status Insert_DuLinkList(DuLinkList* L, ElemType_Int e, int i) {
if (!*L) {
(*L) = MALLOC(1, DuNode);
(*L)->data = e;
(*L)->prior = *L;
(*L)->next = *L;
return OK;
}
int count;
DuLinkList p, t;
for (p = *L, count = 1; count < i; p = p->next, count++);
t = MALLOC(1, DuNode);
t->data = e;
t->next = p;
t->prior = p->prior;
t->prior->next = t;
p->prior = t;
return OK;
}
//若第i个元素存在,删除它,并用e返回
Status Delete_SqList(SqList* L, ElemType_Int* e, int i) {
if ((*L).length < i)
return ERROR;
*e = (*L).elem[i - 1];
for (; i < (*L).length - 1; i++)
(*L).elem[i - 1] = (*L).elem[i];
(*L).length--;
return OK;
}
Status Delete_LinkList(LinkList* L, ElemType_Int* e, int i) {
int count;
LinkList p, q;
for (p = *L, q = p, count = 0; p && count < i - 1; count++, q = p, p = p->next);
if (!p)
return ERROR;
*e = p->data;
if (p == *L)
*L = (*L)->next;
else
q->next = p->next;
free(p);
return OK;
}
Status Delete_HLinkList(HLinkList* L, ElemType_Int* e, int i) {
HLink p, q;
int count;
for (p = (*L).head->next, q = p, count = 0; p && count < i - 1; count++, q = p, p = p->next);
if (!p)
return ERROR;
*e = p->data;
(*L).length--;
if (p == q)
(*L).head->next = p->next;
else
q->next = p->next;
free(p);
return OK;
}
Status Delete_DuLinkList(DuLinkList* L, ElemType_Int* e, int i) {
int count;
DuLinkList p, q;
for (p = *L, q = p, count = 0; p && count < i - 1; count++, q = p, p = p->next);
if (!p)
return ERROR;
*e = p->data;
if (p == *L) {
(*L)->next->prior = NULL;
*L = (*L)->next;
}
else {
q->next = p->next;
p->next->prior = q;
}
free(p);
return OK;
}
//复制L
Status Copy_SqList(SqList L, SqList* Q) {
(*Q).length = L.length;
(*Q).listsize = L.listsize;
for (int i = 0; i < L.length; i++)
(*Q).elem[i] = L.elem[i];
return OK;
}
//打印输出
//从0号位输出
void OutPutSqList(SqList L) {
for (int i = 0; i < L.length; printf("%5d", L.elem[i++]));
printf("\n");
}
//0号位不输出
void OutPutSqList_1(SqList L) {
for (int i = 1; i <= L.length; printf("%5d", L.elem[i++]));
printf("\n");
}
void OutPutLinkList(LinkList L) {
LinkList p;
for (p = L; p; printf("%3d", p->data), p = p->next);
printf("\n");
}
void OutPutHLinkList(HLinkList L) {
HLink p;
for (p = L.head->next; p; printf("%3d", p->data), p = p->next);
printf("\n");
}
void OutPutDuLinkList(DuLinkList L) {
DuLinkList p;
p = L;
do {
printf("%3d", p->data);
p = p->next;
} while (p != L);
printf("\n");
}
#endif // !XXB_C