判断链表前N个字符是否中心对称

7、题目:设单链表的表头指针为h(这里我习惯性的用了head),结点结构由data和next两个域构成,其中data域为字符型。
试设计算法判断该链表的前n个字符是否中心对称。例如xyx,xyyx都是中心对称。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAN_ERR 0
#define MAN_OK 1

struct node
{
    char data;
    struct node * next;
};
typedef struct node Node;
typedef struct node * link;
void create_link(link *head)
{
    *head = (link)malloc(sizeof(Node));
    (*head)->next = NULL;
}
int is_malloc_ok(link new_node)
{
    if(new_node == NULL)
    {
        printf("malloc error!\n");
        return MAN_ERR;
    }
    return MAN_OK;
}
void create_node(link head,link *new_node,int n)
{
    int i;
    char a;
    link p;
    p = head;

    for(i=1;i<=n;i++)
    {    
        scanf("%c",&a); 
        *new_node =(link)malloc(sizeof(Node));
        while(is_malloc_ok(*new_node)==0)
        {
            *new_node =(link)malloc(sizeof(Node));
        }
        (*new_node)->data = a;
       
        while(p->next != NULL)
        {
            p = p->next;
        }
        p->next = *new_node;
        (*new_node)->next = NULL;
    }
}
int judge_link(link head, int n)
{
    link p;
    p = head->next;
    char s[10];
    int i, j;

    for(i=1;i<=n/2;i++)
    {
        s[i]=p->data;
        p = p->next;
    }
    if(n%2==1)
    {
        p = p->next;
    }
    j = i-1;
    for(i=j;i>=1;i--)
    {
        if(p->data == s[i])
        {
            p = p->next;
        }
        else
        {
            break;
        }
    }
    if( i!=0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
void display_link(link head)
{
    link p = NULL;

    if(head == NULL)
    {
        printf("link is empty!\n");
        return;
    }
    if(head->next == NULL)
    {
        return;
    }
    else
    {
        p = head->next;
        while(p != NULL)
        {
            printf("data = %c\n",p->data);
            p = p->next;
        }
    }
}
void release_link(link * head)
{
    link p;
    p = *head;
    
    if(p == NULL)
    {
        printf("link is empty!\n");
        return;
    }
    else
    {
        p = (*head)->next;
        while(p != NULL)
        {
            (*head)->next = p->next;
            free(p);
            p = p->next;
        }
        free(*head);
        *head = NULL;
    }
}
int main()
{
    link head = NULL;
    link new_node = NULL;
    int n, a;
    printf("要输入几位数据:\n");
    scanf("%d",&n);
    getchar();
    create_link(&head);
    create_node(head,&new_node,n);
    display_link(head);
    a=judge_link(head,n);
    if(a==0)
    {
        printf("不是中心对称\n");
    }
    if(a==1)
    {
        printf("是中心对称\n");
    }
    release_link(&head);
    display_link(head);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值