2020-07-23(C语言)数据结构-试设计算法判断该链表的全部n个字符是否中心对称。

//设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx,xyyx都是中心对称。

include

include

include

typedef struct LNode
{
char data;
struct LNode *next;
} LNode, *LinkList;
LinkList List_TailInsert(LinkList L)
{
char x; //设元素类型为整型
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; //r为表尾指针
printf("请输入表元素(以a结尾):");
scanf("%c", &x); //输入结点的值
while (x != 'a') //输入999表示结束
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; //r指向新的表尾结点
scanf("%c", &x);
}
r->next = NULL; //尾结点指针置空
return L;
}
void print(LinkList L)
{
while (L->next != NULL)
{
L = L->next;
printf("%c ", L->data);
}
}

int Getlength(LinkList L)
{
int i = 0;
LNode *p;
p = L->next;
while (p)
{
i++;
p = p->next;
}
printf("长度为: %d\n", i);
return i;
}
int dc(LinkList L, int n)
{
int i;
LNode *p;
char s[n / 2]; //s字符栈
p = L->next; //p是链栈的工作指针,指向待处理的当前元素
for (i = 0; i < n / 2; i++) //链表前一半元素进栈
{
s[i] = p->data;
p = p->next;
}
i--; //恢复最后的i值
if (n % 2 == 1) //若n是奇数,后移过中心结点
{
p = p->next;
}
while (p != NULL && s[i] == p->data) //检测是否中心对称
{
i--; //i充当栈顶指针
p = p->next;
}
if (i == -1) //栈为空栈
{
return 1; //链表中心对称
}
else
{
return 0; //链表不中心对称
}
}
int main()
{
LinkList L, A;
int i;
A = (LinkList)malloc(sizeof(LNode));
A = List_TailInsert(L);
printf("尾插法建立的单链表:");
print(A);
printf("\n");
i = Getlength(A);
if (dc(A, i) == 1)
{
printf("链表中心对称。");
}
else
{
printf("链表不中心对称。");
}
printf("\n");
return 0;
}
//运行结果:


WX20200723-155811.png

你可能感兴趣的:(2020-07-23(C语言)数据结构-试设计算法判断该链表的全部n个字符是否中心对称。)