main函數:
#ifndef __loopLinkList_H__#define __loopLinkList_H__typedef int datatype;union msg{ //若數據的類型也為int,則不需要這個聯合體datatype data;int len; //放頭結點,記錄鏈表長度};typedef struct node{union msg text;struct node* next; //指針,由于指針指向這一整個節點,所以類型為struct node*}loopLinkList;loopLinkList* create_loopLinkList(void);void insertHead_loopLinkList(loopLinkList* head,datatype num);void insertTail_loopLinkList(loopLinkList* head,datatype num);void deleteHead_loopLinkList(loopLinkList* head);void deleteTail_loopLinkList(loopLinkList* head);void show_loopLinkList(loopLinkList* head);#endif
功能函數:
#include<stdio.h>
#include <stdlib.h>
#include "./13_loopLinkList.h"
//創建一個單向循環鏈表
loopLinkList* create_loopLinkList()
{ //定義頭結點并初始化 loopLinkList* head=(loopLinkList*)malloc(sizeof(loopLinkList)); head->next=head; head->text.len=0; return head;
}
//判斷鏈表是否為空
int isEmpty_loopLinkList(loopLinkList* head)
{ //1表示鏈表為空,0表示鏈表不為空 return head->next==head?1:0;
}
//頭插
void insertHead_loopLinkList(loopLinkList* head,datatype num)
{ //申請一個空間定義一個新的結點 loopLinkList* temp=(loopLinkList*)malloc(sizeof(loopLinkList)); if(NULL == temp) { printf("結點定義失敗!\n"); return; } //初始化這個結點 temp->text.data=num; temp->next=NULL; //插入 temp->next=head->next; head->next=temp; head->text.len++; return;
}
//尾插
void insertTail_loopLinkList(loopLinkList* head,datatype num)
{ //申請一個空間定義一個新的結點 loopLinkList* temp=(loopLinkList*)malloc(sizeof(loopLinkList)); if(NULL == temp) { printf("結點定義失敗!\n"); return; } //初始化這個結點 temp->text.data=num; temp->next=NULL; //找到鏈表最后一個結點 loopLinkList* p=head; while(p->next!=head) { p=p->next; } //插入temp temp->next=head; p->next=temp; head->text.len--; return;
}
//按位置插入
void insertByPositon_loopLinkList(loopLinkList* head,datatype num,int pos)
{ if(pos<1 || pos >head->text.len+1) { printf("插入位置不合法!\n"); } loopLinkList* temp = (loopLinkList*)malloc(sizeof(loopLinkList)); temp->text.data=num; temp->next=NULL; loopLinkList* p=head; int i; for(i=0;i<pos-1;i++) { p=p->next; } temp->next=p->next; p->next=temp; head->text.len++; return;
}
//頭刪
void deleteHead_loopLinkList(loopLinkList* head)
{ if(isEmpty_loopLinkList(head)) { printf("鏈表為空,刪除失敗!\n"); return; } loopLinkList* temp=head->next; head->next=temp->next; free(temp); head->text.len--; return;
} //尾刪 void deleteTail_loopLinkList(loopLinkList* head) { if(isEmpty_loopLinkList(head)) { printf("鏈表為空,刪除失敗!\n"); return; } loopLinkList* p=head; while(p->next->next!=head) { p=p->next; } free(p->next); p->next=head; head->text.len--; return; } //按位置刪除 void deleteBypos_loopLinkList(loopLinkList* head,int pos) { if(isEmpty_loopLinkList(head)) { printf("鏈表為空,刪除失敗!\n"); return; } loopLinkList* p=head; int i; for(i=0;i<pos-1;i++) { p=p->next; } free(p->next); p->next=p->next->next; head->text.len--; return; } //遍歷 void show_loopLinkList(loopLinkList* head) { loopLinkList* p=head; if(isEmpty_loopLinkList(head)) { printf("鏈表為空!\n"); return; } while(p->next!=head) { p=p->next; printf("%d ",p->text.data); } printf("\n"); return; }
//約瑟夫問題 void josepg_loopLinkList(int n ,int k,int m){loopLinkList* head = create_loopLinkList();//將1到n的數據插入到循環列表中int i=0;for(i=1;i<=n;i++){insertTail_loopLinkList(head,i);}//刪除頭結點,將頭指針指向頭結點后的第一個有效數據loopLinkList* p=head;while(p->next!=head){p=p->next;}//p就是當前鏈表的尾結點//移動頭指針到第一個有效數據head=head->next;//釋放頭結點free(p->next);//將尾結點的指針指向第一個有效數據p->next=head;//通過循環找到編號為1的位置p=head;for(i=0;i<k-1;i++){p=p->next;}//p就是編號為1的位置while(p->next != p)//當鏈表中只有一個結點時退出循環{//找到要出列的那個數的前一個結點for(i=0;i<m-2;i++){p=p->next;}//p就是要出列的前一個結點//將要數列的那個結點存起來,后面方便釋放loopLinkList* temp = p->next;//將p的指針域指向要出列的結點的下一個結點,即將要出列的那個節點刪除p->next = temp->next;//打印出列的結點里面的數printf("%d ",temp->text.data);//釋放該結點free(temp); temp=NULL;//將剛剛出隊的下一個結點置為1p=p->next;}//上述循環后,整個鏈表中還剩一個結點printf("%d\n",p->text.data);free(p);p=NULL;}
頭文件:
#ifndef __loopLinkList_H__ #define __loopLinkList_H__ typedef int datatype; union msg{ //若數據的類型也為int,則不需要這個聯合體 datatype data; int len; //放頭結點,記錄鏈表長度 }; typedef struct node{ union msg text; struct node* next; //指針,由于指針指向這一整個節點,所以類型為struct node* }loopLinkList; loopLinkList* create_loopLinkList(void); void insertHead_loopLinkList(loopLinkList* head,datatype num); void insertByPositon_loopLinkList(loopLinkList* head,datatype num,int pos); void insertTail_loopLinkList(loopLinkList* head,datatype num); void deleteHead_loopLinkList(loopLinkList* head); void deleteTail_loopLinkList(loopLinkList* head); void show_loopLinkList(loopLinkList* head);
void josepg_loopLinkList(int n,int k,int m);void deleteBypos_loopLinkList(loopLinkList* head,int pos);#endif