單向循環(huán)鏈表

單向循環(huán)列表的操作

# 單項(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;

}

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容