# 單項(xiàng)循環(huán)列表
```
typedef int ElemType;
typedef int Status;
//定義結(jié)點(diǎn)
typedef struct Node{
? ? ElemType data;
? ? structNode *next;
}Node;
typedef struct Node* LinkList;
```
## 創(chuàng)建
```
/*
循環(huán)鏈表創(chuàng)建!
2種情況:① 第一次開(kāi)始創(chuàng)建; ②已經(jīng)創(chuàng)建,往里面新增數(shù)據(jù)
1. 判斷是否第一次創(chuàng)建鏈表
? ? YES->創(chuàng)建一個(gè)新結(jié)點(diǎn),并使得新結(jié)點(diǎn)的next 指向自身; (*L)->next = (*L);
? ? NO-> 找鏈表尾結(jié)點(diǎn),將尾結(jié)點(diǎn)的next = 新結(jié)點(diǎn). 新結(jié)點(diǎn)的next = (*L);
*/
Status CreatList(LinkList *L) {
? ? int item; // 保存數(shù)據(jù)
? ? LinkList temp = NULL; // 新創(chuàng)建的節(jié)點(diǎn)
? ? LinkList target = NULL; // 尾節(jié)點(diǎn)
? ? printf("輸入節(jié)點(diǎn)的值,輸入0結(jié)束\n");
? ? while(1) {
? ? ? ? scanf("%d", &item);
? ? ? ? if(item == 0) break;
? ? ? ? /*
? ? ? ? 若果創(chuàng)建的鏈表是空,
? ? ? ? 01 則創(chuàng)建一個(gè)新的節(jié)點(diǎn),
? ? ? ? 02 使用next指針指向自己 (*head)->next = *head;
? ? ? ? */
? ? ? ? if (*L == NULL) {
? ? ? ? ? ? // 01
? ? ? ? ? ? *L = (LinkList)malloc(sizeof(Node));
? ? ? ? ? ? if(!L) exit(0);
? ? ? ? ? ? (*L)->data = item;
? ? ? ? ? ? // 02
? ? ? ? ? ? (*L)->next = *L;
? ? ? ? } else {
? ? ? ? ? ? /*
? ? ? ? ? ? 如果鏈表不空
? ? ? ? ? ? 01 找到鏈表的尾節(jié)點(diǎn)
? ? ? ? ? ? 02 創(chuàng)建新節(jié)點(diǎn)
? ? ? ? ? ? 03 使用尾節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
? ? ? ? ? ? 04 新節(jié)點(diǎn)的next指向頭節(jié)點(diǎn)
? ? ? ? ? ? */
? ? ? ? ? ? // 01 找到尾節(jié)點(diǎn)
? ? ? ? ? ? for(target = *L; target->next != *L; target = target->next);
? ? ? ? ? ? // 02
? ? ? ? ? ? temp = (LinkList)malloc(sizeof(Node));
? ? ? ? ? ? if (!temp) return ERROR;
? ? ? ? ? ? temp->data = item;
? ? ? ? ? ? // 03
? ? ? ? ? ? target->next = temp;
? ? ? ? ? ? // 04
? ? ? ? ? ? temp->next = *L;
? ? ? ? }
? ? }
}
```
```
Status CreatList2(LinkList *L) {
? ? int item; // 保存數(shù)據(jù)
? ? LinkList *temp = NULL; // 新創(chuàng)建的節(jié)點(diǎn)
? ? LinkList *tail = NULL; // 尾節(jié)點(diǎn)
? ? printf("輸入節(jié)點(diǎn)的值,輸入0結(jié)束\n");
? ? while(1) {
? ? ? ? scanf("%d", &item);
? ? ? ? if(item == 0) break;
? ? ? ? /*
? ? ? ? 若果創(chuàng)建的鏈表是空,
? ? ? ? 01 則創(chuàng)建一個(gè)新的節(jié)點(diǎn),
? ? ? ? 02 使用next指針指向自己 (*head)->next = *head;
? ? ? ? 03 尾節(jié)點(diǎn)->next = 頭節(jié)點(diǎn)
? ? ? ? */
? ? ? ? if(*L == NULL) {
? ? ? ? ? ? // 01
? ? ? ? ? ? *L = (LinkList)malloc(sizeof(Node));
? ? ? ? ? ? if(!*L) return ERROR;
? ? ? ? ? ? (*L)->data = item;
? ? ? ? ? ? // 02
? ? ? ? ? ? (*L)->next = *L;
? ? ? ? ? ? // 03
? ? ? ? ? ? tail = *L;
? ? ? ? } else {
? ? ? ? ? ? /*
? ? ? ? ? ? 如果鏈表不空
? ? ? ? ? ? 01 找到鏈表的尾節(jié)點(diǎn)
? ? ? ? ? ? 02 尾節(jié)點(diǎn)->next = 新節(jié)點(diǎn)
? ? ? ? ? ? 03 新節(jié)點(diǎn)->next = 頭節(jié)點(diǎn)
? ? ? ? ? ? 04 尾節(jié)點(diǎn)指向新節(jié)點(diǎn)
? ? ? ? ? ? */
? ? ? ? ? ? // 01
? ? ? ? ? ? temp = (LinkList)malloc(sizeof(Node));
? ? ? ? ? ? if(!temp) return ERROR;
? ? ? ? ? ? temp->next = item;
? ? ? ? ? ? // 02
? ? ? ? ? ? tail->next = temp;
? ? ? ? ? ? // 03
? ? ? ? ? ? temp->next = *L;
? ? ? ? ? ? // 04
? ? ? ? ? ? tail = temp;
? ? ? ? }
? ? }
}
```
## 遍歷
```
void Show(LinkList L) {
? ? if(p == NULL) {
? ? ? ? printf("打印的鏈表為空!\n");
? ? ? ? return
? ? }
? ? LinkList temp = L;
? ? do {
? ? ? ? printf("%5d",temp->data);
? ? ? ? temp = temp->next;
? ? } while(temp != L)
? ? printf("\n")
}
```
## 插入
```
Status LinkInsert(LinkList *L, int place, int num) {
? ? LinkList temp, target;
? ? int i;
? ? if(place == 1) {
? ? ? ? //如果插入的位置為1,則屬于插入首元結(jié)點(diǎn),所以需要特殊處理
? ? ? ? //1. 創(chuàng)建新結(jié)點(diǎn)temp,并判斷是否創(chuàng)建成功,成功則賦值,否則返回ERROR;
? ? ? ? //2. 找到鏈表最后的結(jié)點(diǎn)_尾結(jié)點(diǎn),
? ? ? ? //3. 讓新結(jié)點(diǎn)的next 執(zhí)行頭結(jié)點(diǎn).
? ? ? ? //4. 尾結(jié)點(diǎn)的next 指向新的頭結(jié)點(diǎn);
? ? ? ? //5. 讓頭指針指向temp(臨時(shí)的新結(jié)點(diǎn))
? ? ? ? temp = (LinkList)malloc(sizeof(Node));
? ? ? ? if(!temp) return ERROR;
? ? ? ? temp->data = num;
? ? ? ? for(target = *L; target->next != *L; target = target->next);
? ? ? ? temp->next = *L;
? ? ? ? target->next = *L;
? ? ? ? *L = temp;
? ? } else {
? ? ? ? temp = (LinkList)malloc(sizeof(Node));
? ? ? ? if(!temp) return ERROR;
? ? ? ? temp->data = num;
? ? ? ? for(i = 1, target = *L; target->next != *L &&? i != place - 1; target = target->next, i++);
? ? ? ? temp->next = target->next;
? ? ? ? target->next = temp;
? ? }
}
```
## 刪除
```
Status LinkListDelete(LinkList *L int place) {
? ? LinkList temp = NULL;
? ? LinkList target = NULL:
? ? temp = *L;
? ? if(!temp) return ERROR;
? ? if (place == 1) {
? ? ? ? // ①.如果刪除到只剩下首元結(jié)點(diǎn)了,則直接將*L置空;
? ? ? ? if((*L)->next == (*L)) {
? ? ? ? ? ? (*L) = NULL;
? ? ? ? ? ? return OK;
? ? ? ? }
? ? ? ? //②.鏈表還有很多數(shù)據(jù),但是刪除的是首結(jié)點(diǎn);
? ? ? ? //1. 找到尾結(jié)點(diǎn), 使得尾結(jié)點(diǎn)next 指向頭結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn) target->next = (*L)->next;
? ? ? ? //2. 新結(jié)點(diǎn)做為頭結(jié)點(diǎn),則釋放原來(lái)的頭結(jié)點(diǎn)
? ? ? ? for(target = *L; target->next != *L; target = target->next);
? ? ? ? temp = *L;
? ? ? ? *L = (*L)->next;
? ? ? ? target->next = (*L);
? ? ? ? free(temp);
? ? } else {
? ? ? ? //如果刪除其他結(jié)點(diǎn)--其他結(jié)點(diǎn)
? ? ? ? //1. 找到刪除結(jié)點(diǎn)前一個(gè)結(jié)點(diǎn)target
? ? ? ? //2. 使得target->next 指向下一個(gè)結(jié)點(diǎn)
? ? ? ? //3. 釋放需要?jiǎng)h除的結(jié)點(diǎn)temp
? ? ? ? for(int = 1, target = *L; target->next != *L && i != place - 1; target = target->next, i++);
? ? ? ? temp = target->next;
? ? ? ? target->next = temp->next;
? ? ? ? free(temp);
? ? }
}
```
## 查詢
```
int FindValue(LinkList L, int value) {
? ? int i = 1;
? ? LinkList temp = NULL;
? ? temp = L;
? ? //當(dāng)尾結(jié)點(diǎn)指向頭結(jié)點(diǎn)就會(huì)直接跳出循環(huán),所以要額外增加一次判斷尾結(jié)點(diǎn)的data == value;
? ? if(temp->next == L && temp->data != value) {
? ? ? ? return -1;
? ? }
? ? //尋找鏈表中的結(jié)點(diǎn) data == value
? ? while(temp->data ! = value && temp->next != L) {
? ? ? ? i++;
? ? ? ? temp = temp->next;
? ? }
? ? return i;
}
```