头文件:
struct Node {
ElemType data;
struct Node *next;
};
typedef struct Node *LinkList;
1.c基本的操作
Status InitList (LinkList *list) {
//返回一个空的线性表
*list = (LinkList)malloc (sizeof(struct Node));
if (!list) {
exit(OVERFLOW);
}
(*list)->next = NULL;
return OK;
}
Status DesroyList (LinkList *list) {
//销毁线性表
LinkList q;
while (*list) {
q = (*list)->next;
free (*list);
*list = q;
}
return OK;
}
Status ClearList (LinkList *list) {
//将链表重置为空表
LinkList p,q;
p = (*list)->next;
while (p) {
q = p->next;
free (p);
q = p;
}
(*list)->next = NULL;
return OK;
}
Status ListEmpty (LinkList *list) {
//判断链表是否为空
if ((*list)->next == NULL) {
return TRUE;
}else {
return FALSE;
}
}
int ListLength (LinkList *list) {
//返回的是链表的长度
int count = 0;
LinkList q = (*list)->next;
while (q) {
count++;
q = q->next;
}
return count;
}
Status GetElem (LinkList *list,int i,ElemType *e) {
//得到i位置上的元素
int j = 1;
LinkList q = (*list)->next;
while (q!=NULL&&j <= i) {
j++;
q = q->next;
}
if (j > i) {
*e = q->data;
return OK;//存在
}
return ERROR;//不存在
}
int locateElem (LinkList *list,ElemType e,Status (*compare)(ElemType,ElemType)) {
//找出相应的位置
LinkList q = (*list)->next;
int count = 0;
while (q) {
if (compare (q->data,e) == 0) {
count++;
break;
}
q = q->next;
}
return count;
}
Status PriorElem (LinkList *list,ElemType cur_e,ElemType *pre_e) {
//cur_e的前一个位置,
LinkList p = (*list)->next;
LinkList q;
if (p!=NULL) {//如果p为空的情况
while (p->next!=NULL) {
q = p->next;
if (q->data == cur_e) {
*pre_e = p->data;
return OK;
}
p = q;
}
}
return ERROR;
}
Status NextElem (LinkList *list,ElemType cur_e,ElemType *pre_e) {
//返回的是cur_e的后一个位置
LinkList p = (*list)->next;
LinkList q;
if (p!=NULL) {
while (p->next!=NULL) {
q = p->next;
if (p->data == cur_e) {
*pre_e = q->data;
return OK;
}
p = q;
}
}
return ERROR;
}
Status ListInsert (LinkList *list,int i,ElemType e) {
//插入的操作
int j = 1;
LinkList q,p;
p = (*list);
while (p!=NULL&&j < i) {
p = p->next;
j++;
}
if (j >= i) {
q = (LinkList)malloc(sizeof (struct Node));
if (q == NULL) {
return ERROR;
}else {
q->data = e;
q->next = p->next;
p->next = q;
}
}
return OK;
}
Status ListDelete (LinkList *list,int i,ElemType *e) {
int j = 0;
LinkList p = *list;
while (p->next&&j < i - 1){
p = p->next;
j++;
}
if (!p->next || j > i - 1) {
return ERROR;
}else {
LinkList q = p->next;
p->next = q->next;
*e = q->data;
free (q);
return OK;
}
}
Status LinkTravrse (LinkList *list,void (*visit)(ElemType)) {
LinkList p = (*list)->next;
while (p!=NULL) {
visit(p->data);
p = p->next;
}
return OK;
}