循环链表操作

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

 

posted @ 2021-08-02 13:25  不负韶华。  阅读(73)  评论(0编辑  收藏  举报