单向循环链表
单向循环链表与单向列表的差别在于其最后一个节点的指针域会指向头结点或首元结点,且在单向循环链表中没有必要再添加头结点。
单向循环列表的C语言代码实现:
首先先定义节点构造体
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node * CycleLinkList;
- 单向循环列表的创建方法
Status initializeCycleLinkedList(CycleLinkList *L) {
int item;
CycleLinkList temp = NULL;
CycleLinkList target = NULL;
printf("input the value of the node, type 0 to finish\n");
while(1) {
scanf("%d", &item);
if (item == 0) break;
if (*L == NULL) {
*L = (CycleLinkList)malloc(sizeof(Node));
if (*L == NULL) return ERROR;
(*L)->data = item;
(*L)->next = *L;
} else {
//下面这行代码用于判断该循环列表中的最后一个节点。
for(target = *L; target->next != *L; target = target->next);
temp = (CycleLinkList)malloc(sizeof(Node));
if (!temp) return ERROR;
temp->data = item;
target->next = temp;
temp->next = *L;
}
}
return OK;
}
- 遍历循环列表中的所有元素
void show(CycleLinkList L) {
CycleLinkList temp = L;
do{
printf("%d ", temp->data);
temp = temp->next;
}while(temp != L);
}
- 在对应的位置上插入元素
Status ListInsert(CycleLinkList *L, int index, int v) {
CycleLinkList temp, target;
int i = 1;
target = *L;
if (index == 1) {
temp = (CycleLinkList)malloc(sizeof(Node));
if(temp == NULL) return ERROR;
temp->data = v;
for(target = *L; target->next != *L; target = target->next);
temp->next = *L;
target->next = temp;
*L = temp;
} else {
for(i=1, target=*L; target->next != *L && i < index-1; i++, target = target->next);
temp = (CycleLinkList)malloc(sizeof(Node));
temp->data = v;
temp->next = target->next;
target->next = temp;
}
return OK;
}
- 删除对应位置上的元素
Status CycleLinkedListDelete(CycleLinkList *L, int index) {
CycleLinkList temp, target;
int i;
temp = *L;
if(temp == NULL || index<1) return ERROR;
if(index == 1){
for(target = *L; target->next != *L; target = target->next);
*L = (*L)->next;
target->next = temp->next;
free(temp);
} else {
for(i=1, target=*L; target != *L, i<index-1; i++, target = target->next);
if(target->next == *L) return -1;
temp = target->next;
target->next = temp->next;
free(temp);
}
return OK;
}