题目要求:
我的代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 100
#define ElemType char
typedef struct LNode{
ElemType data;
struct LNode* next;
}Node,*LinkList;
//头插法构造单链表:
LinkList List_HeadInsert(LinkList &L)
{
ElemType x;
scanf("%c",&x);
if(x=='9')return NULL;
L=(LinkList)malloc(sizeof(LNode));
L->data=x;
L->next=NULL;
LNode *s;
scanf(" %c",&x);
while(x!='9')
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf(" %c",&x);
}
return L;
}
//栈的基本数据类型定义:
typedef struct{
ElemType data[MaxSize];
int top;
}Stack;
void InitStack(Stack &S)
{
memset(S.data,'\0',MaxSize);
S.top=-1;
}
bool Push(Stack &S,ElemType x)
{
if(S.top==MaxSize)return false;
S.data[++S.top]=x;
return true;
}
bool Pop(Stack &S,ElemType &e)
{
if(S.top==-1)return false;
e=S.data[S.top--];
return true;
}
//真正写在试卷上的:
void IsSymmetric(LinkList &L)
{
int Length=0;
LNode* p=L;
while(p)
{
Length++;
p=p->next;
}
Stack S; //定义一个栈S
InitStack(S); //栈的初始化
p=L;
int i=1;
while(i<=(Length/2)) //让链表前半部分的元素入栈.
{
Push(S,p->data); //入栈操作
p=p->next;
i++;
}
if(Length%2!=0)p=p->next;
//StackEmpty函数用于判断是否栈空,循环的条件是栈不空且链表未到底
ElemType e;
while(Pop(S,e)&&p)
{
if(e!=p->data)
{
printf("\n否\n");
return;
}
p=p->next;
}
printf("\n是\n");
}
//................................
void DeleteList(LinkList &L)
{
LNode *p=L,*s;
while(p)
{
s=p;
p=p->next;
free(s);
}
return;
}
int main()
{
LinkList L;
printf("\n使用头插法构造单链表:\n");
List_HeadInsert(L);
printf("\n该链表是否中心对称:\n");
IsSymmetric(L); //用于判断的函数
DeleteList(L);
return 0;
}
看了视频发现自己审题有误, 题目说“全部n个元素”就说明题目其实把单链表的长度已经给我了,也就说在IsSymmetric函数里我应该放上L和n两个参数。不过在算法思想上我是符合的