迴圈連結串列操作
阿新 • • 發佈:2021-08-02
#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); }
為何運用二級指標在前面一篇有頭節點的單鏈表中有解析!