赞
踩
设计算法,判断带头结点的循环双向链表中的数据结点是否对称。
如果对称,输出“yes”
如果不对称,输出“no”
链表空则输出“NULL”
在这里给出一组输入。例如:
abcxba
在这里给出相应的输出。例如:
- a b c x b a
- no
此题的运行案例有问题,案例后必须加上回车
-
- typedef char ElemType;
- typedef struct DNode //定义循环双链表结点类型
- {
- ElemType data;
- struct DNode *prior,*next;
- } DLinkNode;
- void InitList(DLinkNode *&L); //初始化一个空的带头节点的双向循环链表 裁判程序实现,略去不表
- void DestroyList(DLinkNode *&L); // 销毁链表 裁判程序实现,略去不表
- bool ListInsert(DLinkNode *&L,int i,ElemType e); // 在链表第i个节点处插入元素为e的节点 。裁判程序实现,略去不表。
-
- void DispList(DLinkNode *L); // 正向顺序输出链表,输出时每个节点元素之间以空格符间隔,以换行符结束。
- int Symm(DLinkNode *L); // 判断链表是否对称,对称时返回1,不对称时返回0,链表为空时返回-1。
- #include <stdio.h>
-
- void InitList(DLinkNode *&L); //裁判程序实现,略去不表
- void DestroyList(DLinkNode *&L); //裁判程序实现,略去不表
- bool ListInsert(DLinkNode *&L,int i,ElemType e);//裁判程序实现,略去不表
- //要求写出以下函数实现
- void DispList(DLinkNode *L);
- int Symm(DLinkNode *L);
-
- int main()
- {
- DLinkNode *h;
- ElemType e;
- InitList(h);
- int i=1;
- char ch;
- while((ch=getchar())!='\n')
- {
- ListInsert(h,i,ch);
- i++;
- }
- DispList(h);
-
- if(Symm(h)==1)
- printf("yes\n");
- else if (Symm(h)==0)printf("no\n");
- else printf("NULL\n");
- DestroyList(h);
- return 0;
- }
-
- /* 请在这里填写答案 */
输出函数要注意就算是空也要输出换行
从头节点出发开始判断,两个指针一个指向头节点,一个指向尾节点
一个向前走一个向后走
- void DispList(DLinkNode *L)
- {
- if(L->next==L&&L->prior==L){
- printf("\n");
- return;
- }else{
- DLinkNode *p=L->next;
- while(p!=L){
- printf("%c ",p->data);
- p=p->next;
- }
- }
- printf("\n");
- }
-
- int Symm(DLinkNode *L)
- {
- if(L->next==L->prior&&L->next==L){
- return -1;
- }DLinkNode *head,*tail;
- head=L->next;
- tail=L->prior;
- while(head!=tail){
- if(head->data!=tail->data){
- return 0;
- }
- head=head->next;
- tail=tail->prior;
- }
- return 1;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。