用C语言编程实现单链表的基本操作。有必要的类型说明,并完成下述函数功能:
(1) CreateList( ):逆序建立一个(带有头结点的)单链表,在键盘上按顺序输入26个大写英文字母A……Z,最后输入的字母Z,放在头结点之后;第一个输入的字母A放在单链表的末尾。
(2) EncryptList( ):将存放于单链表中的所有字母均前移3个位置,即经过前移后变化为:
(3) ListPrint( ):显示单链表所有元素,此函数调用2次,分别在EncryptList ( )函数调用之前、之后使用。
在主函数main( )中调用各个子函数完成单链表的基本操作。
运行结果如下:
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
char data;
LNode *next;
}* LNodePtr;
LNodePtr CreateList()
{
//初始化头节点
LNodePtr head = (LNodePtr)malloc(sizeof(LNode));
head->data = 0;
head->next = NULL;
LNodePtr tNode;//临时节点
char data;
while(true)
{
scanf("%c",&data);
if(data == '\0' || data == '\n' || data == '\r' || data == '\t')
{
continue;
}
if(data == '!')//输入感叹号停止插入节点
{
printf("输入链表元素结束。\n");
break;
}
if(data >= 'A' && data <= 'Z')
{
tNode = (LNodePtr)malloc(sizeof(LNode));
tNode->data = data; /* 数据域赋值 */
tNode->next = head->next;
head->next = tNode;
}
else
{
printf("输入字符需为大写字母。\n");
}
}
return head;
}
/**
加密函数,加密的方式为链接head的所有节点前移offset位,但是不支持offset比链表的节点数多
@param head 链表头节点
@param offset 节点前移的位数
*/
void EncryptList(LNodePtr head,int offset)
{
LNodePtr tNode = head->next;
int i;
for(i = 0; i < offset; i++)
{
if(tNode->next != NULL)
{
tNode = tNode->next;
}
}
if(i == offset)
{
LNodePtr newHead = tNode;
LNodePtr tail = tNode;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = head->next;
while(tNode->next != NULL)
{
if(tNode->next != newHead)
{
tNode = tNode->next;
}
else
{
tNode->next = NULL;
break;
}
}
head->next = newHead;
}
else
{
printf("不支持移动");
}
}
void ListPrint(LNodePtr head)
{
if(head->next != NULL)
{
LNodePtr tNode = head->next;
while (tNode->next != NULL)
{
printf("%c ",tNode->data);
tNode = tNode->next;
}
printf("%c",tNode->data);
}
}
int main()
{
LNodePtr list = CreateList();
printf("\n创建的链表如下:\n");
ListPrint(list);
EncryptList(list,3);
printf("\n所有节点前移了3位之后的链表如下:\n");
ListPrint(list);
printf("\n");
return 0;
}
如果看不懂代码可以问我