3,循环链表
3.1创建一个循环链表
DuList* createDuList()
{
DuList* list = calloc(1, sizeof(DuList));
assert(list != NULL);
list->front = calloc(1, sizeof(Node));
assert(list->front != NULL);
list->tail = list->front;
list->front->prev = list->front;
list->tail->next = list->front;
return list;
}
3.2尾插
void push_back(DuList* list, Data data)
{
Node* newNode = createNode(data);
newNode->next = list->tail->next;
newNode->prev = list->tail;
list->tail->next = newNode;
list->tail = newNode;
list->front->prev = newNode;
list->size++;
}
3.3输出
void show_list(DuList* list)
{
if (empty(list))
{
return;
}
#if 0
Node* curNode = list->front->next;
while (curNode!=list->front)
{
printf("%d ", curNode->data);
curNode = curNode->next;
}
#else
Node* curNode = list->tail;
while (curNode != list->front)
{
printf("%d ", curNode->data);
curNode = curNode->prev;
}
#endif
printf("\n");
}
3.4查找指定元素
Node* find(DuList* list, Data data)
{
if (empty(list))
{
return NULL;
}
Node* curNode = list->front->next;
while (curNode!= list->front)
{
if (curNode->data==data)
{
return curNode;
}
curNode = curNode->next;
}
return list->front;
}
3.5尾部删除
void pop_back(DuList* list)
{
if (empty(list))
{
return;
}
list->tail = list->tail->prev;
free(list->tail->next);
list->tail->next = list->front;
list->size--;
}
3.6排序
void sort(DuList* list)
{
if (empty(list))
{
return;
}
for (Node* i = list->front->next; i->next!= list->front; i=i->next)
{
for (Node* k = list->front->next; k->next != list->front; k = k->next)
{
if (k->data>k->next->data)
{
Data t = k->data;
k->data = k->next->data;
k->next->data = t;
}
}
}
}
3.7清除
void clear(DuList* list)
{
if (empty(list))
{
return;
}
while (list->front->next!= list->front)
{
pop_front(list);
}
list->size = 0;
}
3.8反转
void reverse(DuList* list)
{
if (size(list) <= 1)
{
return;
}
Node* curNode = list->front->next;
Node* prevNode = list->front;
Node* nextNode = list->front;
list->tail = curNode;
while (curNode!= list->front)
{
nextNode = curNode->next;
curNode->next = prevNode;
curNode->prev = nextNode;
prevNode = curNode;
curNode = nextNode;
}
list->front->next = prevNode;
prevNode->prev = list->front;
}