33,008
社区成员
发帖
与我相关
我的任务
分享
/* 已知单链表的头指针为head,数据域为字符型,请编写算法,判断该链表的前n个字符是否中心对称。例如,abba、abcba都是中心对称。*/
/* 算法:将单链表倒置后,保存在另一个单链表中,然后依次比较两个单链表中各个元素是否相同 */
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct Node
{
struct Node *next;
ElemType data;
} Node, *LinkedList;
/* 单链表的建立 */
LinkedList LinkedListCreatT()
{
Node *L, *p, *q;
ElemType ch;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
q = L;
/* 这里改成换行表示输入结束,因为本人实在不会用EOF */
for (ch = getchar(); ch != '\n'; ch = getchar())
{
p = (Node *)malloc(sizeof(Node));
p->data = ch;
q->next = p;
q = p;
}
q->next = NULL;
return L;
}
/* 删除单链表(新加的) */
void DeleteList(LinkedList *L)
{
Node *p = *L, *q;
while (p != NULL)
{
q = p;
p = p->next;
free(q);
q = NULL;
}
}
/* 单链表的倒置 */
/* 这个函数的问题在于,改变了原表!这是我改之后的 */
LinkedList LinkedListInverse(LinkedList L)
{
Node *p, *q, *N;
N = (Node *)malloc(sizeof(Node));
N->next = NULL;
for (p = L->next; p != NULL; p = p->next)
{
q = (Node *)malloc(sizeof(Node));
q->data = p->data;
q->next = N->next;
N->next = q;
}
return N;
}
/* 判断是否为中心对称 */
void Cent(LinkedList L)
{
Node *temp, *p, *q;
temp = LinkedListInverse(L);
/* 比较两个单链表中数据是否相同 */
p = L->next;
q = temp->next;
while (p != NULL && q != NULL)
{
if (p->data != q->data)
{
printf("NO\n");
DeleteList(&temp);
return;
}
p = p->next;
q = q->next;
}
printf("YES\n");
}
int main()
{
Node *list;
printf("输入要测试的字符链表:");
list = LinkedListCreatT();
Cent(list);
DeleteList(&list);
return 0;
}