天天看點

循環連結清單操作

#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); 
}