#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *Next;
}Node;
//循環連結清單思路:循環連結清單和單連結清單的差別在于:最後一個節點的指針域是指向第一個節點的;其餘的都和單連結清單相同;注意:第一個節點單獨考慮;
//初始化連結清單
void ds_init(Node **head){
*head=NULL;
int item;
Node *target;
Node *temp;
printf("請輸傳入連結表初始的值:\n");
while(1){
scanf("%d",&item);
if(!item) return;
if((*head)==NULL){
*head=(Node*)malloc(sizeof(Node));
if(!(*head))exit(0);
(*head)->data=item;
(*head)->Next=*head;
}
else{
for(target=*head;target->Next!=*head;target=target->Next);
temp=(Node*)malloc(sizeof(Node));
if(!temp) exit(0);
temp->data=item;
temp->Next=*head;
target->Next=temp;
}
}
}
//在連結清單的第i個節點插入值
void ds_insert(Node **head,int i){
Node *temp;
Node *target;
int item,j;
printf("請輸入插入的值:\n");
scanf("%d",&item);
if(i==1){
temp=(Node*)malloc(sizeof(Node));
if(!temp) exit(0);
temp->data=item;
for(target=*head;target->Next!=*head;target=target->Next);
target->Next=temp;
temp->Next=*head;
}
else{
target=*head;
for(j=1;j<i-1;j++){
target=target->Next;
}
temp=(Node*)malloc(sizeof(Node));
if(!temp) exit(0);
temp->data=item;
temp->Next=target->Next;
target->Next=temp;
}
}
//删除連結清單的第i個節點
void ds_delete(Node** head,int i){
Node *target;
Node *temp;
int j=1;
if(i==1){
for(target=*head;target->Next!=*head;target=target->Next);
target->Next=(*head)->Next;
temp=*head;
*head=temp->Next;
free(temp);
}
else{
target=*head;
for(;j<i-1;j++){
target=target->Next;
}
temp=target->Next;
target->Next=temp->Next;
free(temp);
}
}
//查找連結清單中的某個元素,且傳回該元素所在節點
int ds_searth(Node** head,int elem){
Node *target=*head;
int i=1;
for(;target->Next!=*head;target=target->Next){
if(target->data==elem){
return i;
}
i++;
}
if(target->Next==*head){
if(target->data==elem)
return i;
else return 0;
}
}
//周遊連結清單
void print(Node **head){
Node *target=*head;
for(;target->Next!=*head;target=target->Next){
printf("%d ",target->data);
}
printf("%d\n",target->data);
}
int main(){
int i;
Node *CLinkList=NULL;
ds_init(&CLinkList);
print(&CLinkList);
printf("請輸入插入的位置:\n");
scanf("%d",&i);
ds_insert(&CLinkList,i);
print(&CLinkList);
printf("請輸入你要删除的位置:\n");
scanf("%d",&i);
ds_delete(&CLinkList,i);
print(&CLinkList);
printf("請輸入你要查找的元素:\n");
scanf("%d",&i);
i=ds_searth(&CLinkList,i);
printf("%d\n",i);
print(&CLinkList);
}
//A,B為兩個循環連結清單的尾指針
Node *connect(Node* A,Node *B){
//儲存B連結清單的頭指針
Node*head=B->Next;
//改變B連結清單的尾指針
B=A->Next;
A->Next=head;
free(head);
}