使用的结构体
typedef int datatype;
typedef struct Node
{
union{
datatype data; //存放的数据
int len; //长度
};
struct Node *next;
}Looplink;
主函数
#include<stdio.h>
#include<stdlib.h>
#include"looplink.h"
int main(int argc, const char *argv[])
{
int num,m,n;
int i,j;
//定义一个头结点存放新表
Looplink *M=list_create();
//从外部传入链表长度
printf("请输入成员个数>>");
scanf("%d",&num);
//创建链表
Looplink *L=list_create();
if(NULL==L)
{
return -1;
}
//使用尾插法循环赋予各结点的数据
for(i=0; i<num; i++)
{
printf("请输入%d位成员>>",i+1);
scanf("%d",&n);
list_insert_tail1(L,n);
}
list_show(L);
printf("请输入想要取的间隔数>>");
scanf("%d",&m);
//删除头结点形成新的循环链表
Looplink *S = kill_head(L);
L=NULL;
//定义遍历指针
Looplink *q=S;
for(i=0; i<num; i++) //保证取出全部数据
{
for(j=0; j<m-1; j++) //根据输入的m的值取到要取出的值的前一项
{
q=q->next;
}
Looplink *p=q->next; //取到要取出的位置
q->next=p->next; //将该结点与S链表断开
list_insert_tail1(M,p->data); //将数据取出并入新表
M->len++; //新表的变化
S->len--;
free(p);
}
list_show(M);
return 0;
}
所使用的功能函数
1、创建一个头结点
Looplink *list_create()
{
Looplink *L = (Looplink*)malloc(sizeof(Looplink));
if(NULL==L)
{
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=L;
return L;
}
2、判空
int list_empty(Looplink *L)
{
return L->next==L ? 1:0; //1表示空 0表示非空
}
3、尾部插入结点
int list_insert_tail1(Looplink *L,datatype e)
{
//判断逻辑
if(NULL==L)
{
printf("所给链表不合法\n");
return -1;
}
//申请新结点存放数据
Looplink *p=(Looplink *)malloc(sizeof(Looplink));
if(NULL==p)
{
printf("结点申请失败\n");
return -2;
}
p->data=e;
p->next=NULL;
//定义遍历指针定位到最后一个结点
Looplink *q=L;
while(q->next !=L)
{
q=q->next;
}
//插入逻辑
p->next=L;
q->next=p;
//表的变化
L->len++;
return 0;
}
4、带头结点遍历
void list_show(Looplink *L)
{
//判断逻辑
if(NULL==L || list_empty(L))
{
printf("遍历失败\n");
return ;
}
//遍历输出
printf("链表的元素分别为:");
Looplink *q=L->next;
while(q!=L)
{
printf("%d\t",q->data);
q=q->next;
}
printf("\n");
}
5、删除头结点
Looplink *kill_head(Looplink *L)
{
//判断逻辑
if(NULL==L || list_empty(L))
{
printf("删除失败\n");
return NULL;
}
//定义指针定位到最后一个位置
Looplink *q=L->next;
while(q->next!=L)
{
q=q->next;
}
//断开头结点
q->next=L->next;
//释放头结点
free(L);
L=NULL;
printf("头结点删除成功\n");
return q->next;
}
6、删除头结点后的遍历
void list_show2(Looplink *S)
{
//判断逻辑
if(NULL==S)
{
printf("遍历失败\n");
return ;
}
//开始遍历
printf("链表的元素分别为:");
Looplink *q=S;
do
{
printf("%d\t",q->data);
q=q->next;
}while(q!=S);
printf("\n");
}
运行结果
请输入成员个数>>8
请输入1位成员>>1
请输入2位成员>>2
请输入3位成员>>3
请输入4位成员>>4
请输入5位成员>>5
请输入6位成员>>6
请输入7位成员>>7
请输入8位成员>>8
链表的元素分别为:1 2 3 4 5 6 7 8
请输入想要取的间隔数>>4
头结点删除成功
链表的元素分别为:1 2 3 4 5 6 7 8
链表的元素分别为:4 8 5 2 1 3 7 6
主函数
int change(seqStack *S)
{
int n;
int num;
int count=0;
printf("请输入你要转换的进制\n");
scanf("%d",&n);
printf("请输入你要转换的十进制数\n");
scanf("%d",&num);
while(num !=0)
{
int res=num%n;
push(S,res);
num=num/n;
count++;
}
for(int i=0;i<count;i++)
{
pop(S);
}
}
使用的功能函数
1、创建栈
seqStack *create()
{
seqStack *S= (seqStack *)malloc(sizeof(seqStack));
if(NULL==S)
{
printf("创建失败\n");
return NULL;
}
//初始化
S->top = -1; //将栈顶设置为-1
printf("创建成功\n");
return S;
}
2、判空
int empty(seqStack *S)
{
return S->top==-1 ? 1:0; //1表示空 0表示非空
}
3、判满
int full(seqStack *S)
{
return S->top==MAX-1 ? 1:0; //1表示满 0表示不满
}
4、入栈、进栈、压栈
int push(seqStack *S,datatype e)
{
//判断逻辑
if(NULL==S || full(S))
{
printf("入栈失败");
return -1;
}
//入栈操作
S->top++;
S->data[S->top] = e;
printf("入栈成功\n");
return 0;
}
5、出栈、弹栈
int pop(seqStack *S)
{
//判断逻辑
if(NULL==S || empty(S))
{
printf("出栈失败\n");
return -1;
}
//出栈成功
printf("%d出栈成功\n",S->data[S->top]);
S->top--;
return 0;
}
6、遍历栈
void show(seqStack *S)
{
//判断逻辑
if(NULL==S || empty(S))
{
printf("遍历失败\n");
return ;
}
//遍历
printf("从栈顶到栈底元素分别是:");
for(int i=S->top; i>=0; i--)
{
printf("%d\t",S->data[i]);
}
printf("\n");
}