先贴出代码
#include<malloc.h> #include<iostream> using namespace std; typedef struct node{ int num; struct node *next; } SLink; //先创建 void init(SLink *&L,int *a,int l){ L = (SLink *)malloc(sizeof(SLink)); L->num=a[0]; L->next=L; SLink *s,*pre=L; for(int i=1;i<l;i++){ s = (SLink *)malloc(sizeof(SLink)); s->next=pre->next; pre->next=s; s->num=a[i]; pre=s; // cout<<a[i]; } } //输出 void show(SLink *&L,int n){ int start=1; SLink *pre=L,*p=pre->next; while(pre->next!=pre){ //找到n的前结点n-1 while(start<n-1){ pre=p; p=p->next; start++;//到n-1、跳出循环 } //到这里了 删除p 将pre指向p的后结点 pre->next=p->next; cout<<p->num; //free(p); pre=p->next; free(p); p=pre->next; start=1; start=1; } cout<<pre->num; free(pre); } int main(){ int a[5]={1,2,3,4,5}; SLink *L; init(L,a,5); show(L,3); return 0; }
关键代码分析
void show(SLink *&L,int n){ //注意问题这个算法只能从第二个元素开始出队 如果为1则结果错误 int start=1;//设置当前指向要出对的结点前结点为L时start=1 当指向第n个结点的前结点时 start=n-1 SLink *pre=L,*p=pre->next; //当结点没有指向自身时循环 while(pre->next!=pre){ //找到n的前结点n-1 while(start<n-1){ pre=p; p=p->next; start++;//到n-1、跳出循环 } //到这里了指向n的前结点 pre->next=p->next;//将前结点的指针指向要删除的结点的后结点 cout<<p->num; //输出要删除的结点的内容 //free(p); pre=p->next;//pre指向将要删除的结点的后继结点 free(p);//删除结点 p=pre->next;//要删除的结点指向pre的后继结点 start=1;//还是相当于从第一个开始 } //释放最后一个剩下来的结点 cout<<pre->num; free(pre); }
12345 4512 3 245 1 24 5 4 2 4 12345 3451 2 513 4 35 1 3 5 3 12345 1234 5 234 1 42 3 2 4 2
从第一个结点开始出队我本人也想不到啥好的方法,有想法的可以分享一下谢谢!
上面的执行结构如下