前提
首先定义节点类型,是一个带头和尾的链表,头结点和尾节点都不存放数据,空链表时,他们首尾相连。
宏定义了需要存储的数据。
代码
#include <stdio.h>
#include <stdlib.h>
#define ElemType char
typedef struct LNode{
ElemType data;
struct LNode *prior;
struct LNode *next;
}*Link,*Position;
typedef struct List{
int len;
Link head, tail;
} *LinkList;
int LocatePos(LinkList l, Link p){
Link cur = l->head;
for (int i = 0; i < l->len; ++i) {
if(cur->next == p){
return i;
}
}
return -1;
};
int MakeNode(Link *p, ElemType e){
(*p) = (Link)malloc(sizeof(struct LNode));
(*p)->data = e;
(*p)->next = (*p)->prior = NULL;
return 0;
};
void FreeNode(Link *p){
free(*p);
*p = NULL;
};
int InitList(LinkList *l){
(*l) = (LinkList)malloc(sizeof(struct List));
(*l)->len = 0;
Link head = NULL; Link *header = &head;
MakeNode(header, (ElemType)NULL);
Link tail = NULL; Link *tailer = &tail;
MakeNode(tailer, (ElemType)NULL);
(*l)->head = head, (*l)->tail = tail;
head->next = tail;
tail->prior = head;
return 0;
};
int DeatoryList(LinkList *l){
free(*l);
*l = NULL;
return 0;
};
int ClearList(LinkList l){
Link cur = l->head;
int length = l->len;
for (int i = 0; i < length; ++i) {
Link tem = cur->next;
free(cur);
cur = tem;
}
l->len = 0;
return 0;
};
int InsFirst(LinkList l, Link s){
Link h = l->head;
s->next = h->next;
s->prior = h;
h->next = s;
s->next->prior = s;
l->len++;
return 1;
}
Link DelFirst(LinkList l){
Link cur = l->head;
if(l->len == 0){
return (Link)NULL;
}
Link temp = cur->next;
cur->next = cur->next->next;
cur->next->prior = cur;
--l->len;
return temp;
};
int Append(LinkList l, Link s){
Link cur = l->tail->prior;
cur->next = s;
s->prior = cur;
while (cur->next){
l->len++;
cur = cur->next;
}
cur->next = l->tail;
l->tail->prior = cur;
return 1;
};
Link Remove(LinkList l){
if(l->len == 0){
return NULL;
}
Link q = l->tail->prior;
l->tail->prior = q->prior;
q->prior->next = l->tail;
l->len--;
return q;
};
ElemType GetCurElem(Link p){
return p->data;
}
int InsBefore(LinkList l, Link p, Link s){
int pos = LocatePos(l,p);
Link cur = l->head;
if(pos != -1){
for (int i = 0; i < pos; ++i) {
cur = cur->next;
}
s->next = cur->next;
s->prior = cur;
s->next->prior = s;
cur->next = s;
l->len++;
return 1;
}
return -1;
}
int insAfter(LinkList l, Link p, Link s){
int pos = LocatePos(l,s);
Link cur = l->head;
if(pos != -1){
for (int i = 0; i < pos; ++i) {
cur = cur->next;
}
cur = cur->next;
s->next = cur->next;
s->prior = cur;
s->next->prior = s;
cur->next = s;
l->len++;
return 1;
}
return -1;
};
int SetCurElem(Link p, ElemType e){
p->data = e;
};
int ListEmpty(LinkList l){
if(l->len == 0){
return 1;
}
return 0;
};
int ListLength(LinkList l){
return l->len;
};
Position GetHead(LinkList l){
return l->head;
};
Position GetLast(LinkList l){
return l->tail;
}
Position PriorPos(Link p){
return p->prior;
};
Position NextPos(Link p){
return p->next;
};
int LocateNode(LinkList l, Link p){
Link cur = l->head;
int length = l->len;
for (int i = 0; i < length; ++i) {
if(cur->next->data == p->data){
return i;
}
cur = cur->next;
}
return -1;
};
Position LocateElem(LinkList l, ElemType e){
Link cur = l->head;
int length = l->len;
for (int i = 0; i < length; ++i) {
if(cur->next->data == e){
return cur->next;
}
cur = cur->next;
}
return NULL;
};
void ListTraverse(LinkList l){
Link p = l->head;
for (int i = 0; i < l->len; ++i) {
printf("%c ",(char)p->next->data);
p = p->next;
}
printf("\n");
};
int main() {
// Link p = NULL; Link *pp = &p;
// LinkList l = NULL; LinkList *ll = &l;
// MakeNode(pp, 'a');
// FreeNode(pp);
// InitList(ll);
// DeatoryList(ll);
//
// InitList(ll);
// for (int i = 0; i < 10; ++i) {
// MakeNode(pp, (ElemType)(i+95));
// InsFirst(l, p);
// }
// Link res = DelFirst(l);
// MakeNode(pp,(ElemType)('*'));
// Link first = p;
// Link index = first;
// for (int i = 0; i < 10; ++i) {
// MakeNode(pp, (ElemType)(i+6));
// index->next = p;
// p->prior = index;
// index = p;
// }
// Append(l, first);
// Link res = Remove(l);
// ClearList(l);
// MakeNode(pp, 'g');
// Link temp = p;
// int res = LocatePos(l, p);
// InsBefore(l,p,p);
// insAfter(l,p,p);
// ListTraverse(l);
// Link res = LocateElem(l,'a');
return 0;
}
1399

被折叠的 条评论
为什么被折叠?



