实现用户输入一个数使26个字母的排列发生变化
* 例如用户输入3,输入结果:
* DEFGHIJKLMNOPQRSTUVWXYZABC
* 同时需要支持负数,例如用户输入-3,输出结果:
* XYZABCDEFGHIJKLMNOPQRSTUVW
假设初始链表:
插入元素(尾插法):
删除元素:
main.c
/*
程序功能:实现用户输入一个数使26个字母的排列发生变化,
* 例如用户输入3,输入结果:
* DEFGHIJKLMNOPQRSTUVWXYZABC
* 同时需要支持负数,例如用户输入-3,输出结果:
* XYZABCDEFGHIJKLMNOPQRSTUVW
编程环境:Dev-C++
程序模块:main.c/circlelink.c/circlelink.h
*/
#include "circlelink.h"
int main()
{
Node *head = NULL; //定义头指针
/********************初始化********************/
int ret;
ret = InitLink(&head);
if (SUCCESS == ret)
{
printf("初始化链表成功!\n");
}
else
{
printf("初始化链表失败!\n");
}
/********************插入元素********************/
int i;
for (i = 0; i < 26; i++)
{
ret = InsertLink(head, 'A' + i);
if (FAILURE == ret)
{
printf("%c插入失败!\n", 'A' + i);
}
}
/********************遍历********************/
printf("请输入一个数字:\n");
int num;
scanf("%d", &num);
ret = Traverse(head, num); //从输入的num位置开始遍历
printf("\n");
if (FAILURE == ret)
{
printf("遍历失败!\n");
}
/********************删除********************/
ret = DelLink(head, 5); //删除第5个元素
if (SUCCESS == ret)
{
printf("删除第%d个元素成功!\n", 5);
}
else
{
printf("删除失败!\n");
}
/********************遍历********************/
ret = Traverse(head, 1); //从第一个结点开始遍历
if (FAILURE == ret)
{
printf("遍历失败!\n");
}
return 0;
}
circlelink.c
#include "circlelink.h"
/*
函数描述:初始化
函数参数:链表的头指针地址
函数返回值:初始化成功返回SUCCESS,初始化失败返回FAILURE
*/
int InitLink(Node **h)
{
if (NULL == h)
{
return FAILURE;
}
*h = (Node *)malloc(sizeof(Node) * 1);
if (NULL == h)
{
return FAILURE;
}
(*h)->next = *h;
(*h)->prior = *h;
return SUCCESS;
}
/*
函数描述:插入元素
函数参数:链表的头指针,插入元素
函数返回值:插入成功返回SUCCESS,插入失败返回FAILURE
*/
int InsertLink(Node *h, char ch)
{
if (NULL == h)
{
return FAILURE;
}
//定义指针指向最后一个结点
Node *q = h->prior;
Node *n = (Node *)malloc(sizeof(Node) * 1);
if (NULL == n)
{
return FAILURE;
}
n->data = ch;
n->prior = q;
n->next = h;
q->next = n;
h->prior = n;
return SUCCESS;
}
/*
函数描述:遍历
函数参数:链表的头指针,遍历开始地址
函数返回值:遍历成功返回SUCCESS,遍历失败返回FAILURE
*/
int Traverse(Node *h, int num)
{
if (NULL == h)
{
return FAILURE;
}
int i;
Node *n = h;
if (num > 0 && num <=26)
{
for (i = 0; i < num; i++)
{
n = n->next;
}
}
else if (num < 0 && num >= -26)
{
for (i = 0; i < -num; i++)
{
n = n->prior;
}
}
else
{
return FAILURE;
}
for (i = 0; i < 26; i++)
{
printf("%c ", n->data);
n = n->next;
if (n == h)
{
n = n->next;
}
}
return SUCCESS;
}
/*
函数描述:删除
函数参数:链表的头指针,删除元素的位置
函数返回值:删除成功返回SUCCESS,删除失败返回FAILURE
*/
int DelLink(Node *h, int p)
{
if (NULL == h)
{
return FAILURE;
}
Node *q = h->next; //指向第一个结点
int k = 1;
while (k < p && q != h) //移动到删除的位置
{
q = q->next;
k++;
}
if (q == h || p <= 0)
{
return FAILURE;
}
q->prior->next = q->next;
q->next->prior = q->prior;
free(q);
return SUCCESS;
}
circlelink.h
#ifndef CIRCLELINK_H
#define CIRCLELINK_H
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 1000
#define FAILURE 1001
struct Node
{
char data; //数据域
struct Node *prior; //前继
struct Node *next; //后继
};
typedef struct Node Node;
int InitLink(Node **h);
int InsertLink(Node *h, char ch);
int Traverse(Node *h, int num);
int DelLink(Node *h, int p);
#endif
结果: