利用双向循环链表,实现用户输入一个数使26个字母的排列发生变化

实现用户输入一个数使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

结果:
在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页