7、题目:设单链表的表头指针为h,结点结构由data和next两个域构成,其中data域为字符型。
试设计算法判断该链表的前n个字符是否中心对称。例如xyx,xyyx都是中心对称。
#include <stdio.h>
#include <stdlib.h>
#define N 3
struct node
{
char data;
struct node * next;
};
typedef struct node Node;
typedef struct node* Link;
void create_node(Link *new_node)
{
*new_node = (Link)malloc(sizeof(Node));
if(*new_node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *head)
{
create_node(head);
(*head)->next = NULL;
}
void insert_node_head(Link head,Link new_node)
{
new_node->next = head->next;
head->next = new_node;
}
int get_length(Link head)
{
Link p = head->next;
int count = 0;
while(p != NULL)
{
count++;
p = p->next;
}
return count;
}
void judge_link(Link head)
{
Link p = NULL;
Link q = NULL;
int length = get_length(head);
int i = 1;
int j = 1;
int flag = 0;
if(head == NULL)
{
printf("no such link!\n");
return;
}
p = head->next;
q = p;
if(p == NULL)
{
printf("link is empty!\n");
return;
}
while(i != length / 2 + 1)
{
while(j != length - i + 1)
{
q = q->next;
j++;
}
if(p->data == q->data)
{
p = p->next;
q = p;
i++;
j = i;
flag = 1;
}
else
{
flag = 0;
i++;
j = i;
}
}
if(flag == 1)
{
printf("对称!\n");
}
else
{
printf("不对称!\n");
}
}
int main()
{
Link head;
Link new_node;
int i;
create_link(&head);
printf("输入字符:");
for(i = 1;i <= N;i++)
{
create_node(&new_node);
new_node->data = getchar();
getchar();
insert_node_head(head,new_node);
}
judge_link(head);
return 0;
}
1、题目:利用链表实现一个先入后出的栈结构,并提供栈操作的push和pop的接口
#include <stdio.h>
#include <stdlib.h>
struct stack
{
int num;
struct stack * next;
};
typedef struct stack Stack;
typedef struct stack* Link;
void create_node(Link *node)
{
*node = (Link)malloc(sizeof(Stack));
if(*node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *head)
{
create_node(head);
(*head)->next = NULL;
}
void push_stack(Link head,Link new_node)
{
new_node->next = head->next;
head->next = new_node;
}
void pop_stack(Link head)
{
Link p;
int n;
p = head->next;
while(p != NULL)
{
n = p->num;
printf("%d\n",n);
head->next = p->next;
free(p);
p = head->next;
}
}
int main()
{
Link head;
Link new_node;
int i;
create_link(&head);
for(i = 0;i < 10;i++)
{
create_node(&new_node);
new_node->num = i + 1;
push_stack(head,new_node); //进栈
}
pop_stack(head); //出栈
return 0;
}
2、题目:使用双向链表来实现双向队列
使用一个双向链表来实现一个双向的队列,并且让队列具有以下的操作:
(1)判断队列是否为空
(2)得到双向队列中元素的个数
(3)向左端添加一个新元素
(4)向右端添加一个新元素
(5)从左端删除一个元素
(6)从右端删除一个元素
#include <stdio.h>
#include <stdlib.h>
struct quece
{
int num;
struct quece * next;
struct quece * prior;
};
typedef struct quece Quece;
typedef struct quece* Link;
void create_node(Link *node)
{
*node = (Link)malloc(sizeof(Quece));
if(*node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_link(Link *head)
{
create_node(head);
(*head)->prior = (*head)->next = *head;
}
void push_quece_right(Link head,Link new_node)
{
new_node->next = head->next;
new_node->prior = head;
head->next = new_node;
new_node->next->prior = new_node;
}
void pop_quece_right(Link head)
{
Link p;
if(head == NULL)
{
printf("no such quece!\n");
return;
}
p = head->prior;
if(p == NULL)
{
printf("quece is empty!\n");
return;
}
while(p != head)
{
printf("%d\n",p->num);
p = p->prior;
}
}
void push_quece_left(Link head,Link new_node)
{
new_node->next = head;
new_node->prior = head->prior;
head->prior = new_node;
new_node->prior->next = new_node;
}
void pop_quece_left(Link head)
{
Link p;
if(head == NULL)
{
printf("no such quece!\n");
return;
}
p = head->next;
if(p == NULL)
{
printf("quece is emoty!\n");
return;
}
while(p != head)
{
printf("%d\n",p->num);
p = p->next;
}
}
int main()
{
Link head;
Link new_node;
int i;
create_link(&head);
for(i = 0;i < 10;i++)
{
create_node(&new_node);
new_node->num = i + 1;
//push_quece_right(head,new_node); //右进队
push_quece_left(head,new_node); //左进队
}
//pop_quece_right(head); //右进队的出队
pop_quece_left(head); //左进队出队
return 0;
}