循环链表与单链表操作的思想一致,主要考虑判断条件不同,且需要操作完毕后将尾指针指向头结点
头文件:
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#define ElemType int
typedef struct Node
{
ElemType data;
struct Node *next;
}Node ,*PNode;
typedef struct List
{
PNode first;
PNode last;
int size;
}List;
PNode _buynode(ElemType x);
void InitSCList(List *list);
void push_back(List *list,ElemType x);
void push_front(List *list,ElemType x);
void show_list(List list);
void pop_back(List *list);
void pop_front(List *list);
void insert_val(List *list,ElemType x);
PNode find(List *list,ElemType key);
int length(List list);
void delete_val(List *list,ElemType x);
void sort(List *list);
void reserve(List *list);
void clear(List *list);
void destroy(List *list);
#endif //_SCLIST_H_
源文件:
#include "SCList.h"
/*申请节点空间*/
PNode _buynode(ElemType x)
{
PNode s = (PNode)malloc(sizeof(Node));
assert(s != NULL);
s->data = x;
s->next = NULL;
return s;
}
void InitSCList(List *list)
{
PNode s = (PNode)malloc(sizeof (Node));
assert(s != NULL);
list->first = list->last = s;
list->last->next = list->first;
list->size = 0;
}
/*尾部插入,顺序插入*/
void push_back(List *list, ElemType x)
{
Node *s = _buynode(x);
list->last->next = s;
list->last = s;
list->last->next = list->first;
list->size++;
}
/*头部插入,逆序插入*/
void push_front(List *list, ElemType x)
{
PNode s = _buynode(x);
s->next = list->first->next;
list->first->next = s;
/*链表中只有一个头结点*/
if(list->first == list->last)
{
list->last = s;
}
list->size++;
}
/*遍历循环链表节点,与单链表不同之处在于循环条件不一样*/
void show_list(List list)
{
PNode p = list.first->next;
while(p != list.first)
{
printf("%d-->",p->data);
p = p->next;
}
printf("Nul.\n");
}
/*尾删*/
void pop_back(List *list)
{
if(list->size == 0)
{
return;
}
PNode p = list->first;
while(p->next != list->last)
{
p=p->next;
}
free(list->last);
list->last = p;
list->last->next = list->first;
list->size--;
}
/*头删*/
void pop_front(List *list)
{
if(list->size == 0)
{
return;
}
PNode p = list->first->next;
list->first->next = p->next;
free(p);
if(list->size == 1)
{
list->last = list->first;
}
list->size--;
}
/*按值插入*/
void insert_val(List *list,ElemType x)
{
if(list->size == 0)
{
push_back(list,x);
return;
}
else
{
PNode s = _buynode(x);
PNode p = list->first;
while(p->next != list->first && p->next->data < x)
{
p = p->next;
}
if(p->next == list->first)
{
push_back(list,x);
return;
}
s->next = p->next;
p->next = s;
list->size++;
}
}
/*查找该节点*/
PNode find(List *list, ElemType key)
{
if(list->size == 0)
{
return NULL;
}
PNode p = list->first->next;
while(p != list->first && p->data != key)
{
p = p->next;
}
if(p == list->first)
{
return NULL;
}
return p;
}
int length(List list)
{
return list.size;
}
/*删除数据*/
void delete_val(List *list,ElemType x)
{
if(list->size == 0)
{
return;
}
PNode p = find(list,x);
if(p == NULL)
{
printf("data is not exist!\n");
return;
}
if(p == list->last)
{
pop_back(list);
return;
}
else
{
PNode s = p->next;
p->data = s->data;
p->next = s->next;
free(s);
list->size--;
}
}
/*排序*/
void sort(List *list)
{
if(list->size == 0 || list->size == 1)
{
return;
}
PNode p = list->first;
PNode q = p->next;
PNode s = q->next;
list->last->next = NULL;
list->last = q;
list->last->next = list->first;
list->size = 1;
while(s != NULL)
{
q = s;
s = q->next;
insert_val(list,q->data);
}
}
/*逆置*/
void reserve(List *list)
{
if(list->size == 0 || list->size == 1)
{
return;
}
PNode p = list->first;
PNode q = p->next;
PNode s = q->next;
list->last->next = NULL;
list->last = q;
list->last->next = list->first;
list->size = 1;
while(s != NULL)
{
q = s;
s = q->next;
push_front(list,q->data);
}
}
/*将节点一一释放,即头部删除*/
void clear(List *list)
{
while(list->size != 0)
{
pop_front(list);
}
}
void destroy(List *list)
{
clear(list);
free(list->first);
list->first = list->last = NULL;
}