【题目】利用链表实现一个先入后出的栈结构,并提供栈操作的push和pop的接口
/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co., Ltd.
File name:
Author:Jerey_Jobs Version:0.1 Date:
Description:进栈出栈
Funcion List:
*****************************************************/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#define MAX 5
struct stack_data
{
int stack[MAX];
int top;
};
typedef struct stack_data Node;
typedef struct stack_data* Stack;
enum return_result{FULL_OK, FULL_NO, PUSH_OK, EMPTY_OK, EMPTY_NO, EXIT_FALL};
void is_malloc_ok(Stack *stack)
{
if(*stack == NULL)
{
exit (EXIT_FALL);
}
}
void create_stack(Stack *stack)
{
*stack = (Stack)malloc(sizeof(Node));
is_malloc_ok(stack);
}
void init_stack(Stack *stack)
{
(*stack)->top = -1; //指向栈外
}
int is_full(Stack *stack)
{
if((*stack)->top == MAX - 1)
{
return FULL_OK;
}
return FULL_NO;
}
int push_stack(Stack *stack, int num)
{
if(is_full(stack) == FULL_OK)
{
printf("stack is full!\n");
return;
// exit (FULL_OK);
}
(*stack)->top++;
(*stack)->stack[(*stack)->top] = num;
return PUSH_OK;
}
int is_empty(Stack *stack)
{
if((*stack)->top == -1)
{
return (EMPTY_OK);
}
return (EMPTY_NO);
}
int pop_stack(Stack *stack, int *num)
{
if(is_empty(stack) == EMPTY_OK)
{
printf("stack is empty!\n");
return;
//exit (EMPTY_NO);
}
*num = (*stack)->stack[(*stack)->top--];
return (EMPTY_OK);
}
int main()
{
Stack stack;
int i, num1, num;
create_stack(&stack);
init_stack(&stack);
srand(time(NULL));
while(1)
{
num = rand() % 100;
if(num > 50)
{
if(push_stack(&stack, num) == PUSH_OK) //入栈push接口
{
printf("push done! %d\n", num);
}
}
else
{
if(pop_stack(&stack,&num1) == EMPTY_OK) //出栈pop接口
{
printf("pop done! %d\n",num1);
}
}
sleep(2);
}
return 0;
}
【题目】创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生。
<span style="font-size:12px;"></span><pre class="csharp" name="code">#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define N 10
struct node
{
char name[N];
int age;
struct node * next;
};
typedef struct node Node;
typedef struct node * link;
void creat_link(link *head)
{
*head = NULL;
}
void is_malloc_ok(link *p)
{
if(*p == NULL)
{
printf("malloc is error!\n");
exit (-1);
}
}
void creat_new_node(link *p)
{
*p = (link)malloc(sizeof(Node));
is_malloc_ok(p);
}
void insert_link(link *tmp, char name[], char age)
{
link p;
creat_new_node(&p);
strcpy(p->name, name);
p->age = age;
p->next = *tmp;
*tmp = p;
}
void display(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
printf("%s %d\n", tmp->name, tmp->age);
tmp = tmp->next;
}
}
void release(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
tmp = tmp->next;
free(p);
p = tmp;
}
printf("空间回收成功!\n");
}
int main()
{
link man = NULL;
creat_link(&man);
link woman = NULL;
creat_link(&woman);
insert_link(&man, "zhangsan", 18);
insert_link(&man, "lisi", 20);
insert_link(&man, "wangwu", 13);
printf("男:\n");
display(man);
insert_link(&woman, "zhangyun", 17);
insert_link(&woman, "zhaofei", 21);
insert_link(&woman, "songjiang", 16);
printf("女:\n");
display(woman);
release(man);
release(woman);
return 0;
}
【题目】将上面两个链表合并,按学生的年龄进行排序,合成新的链表
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define N 10
struct node
{
char name[N];
int age;
struct node * next;
};
typedef struct node Node;
typedef struct node * link;
void creat_link(link *head)
{
*head = NULL;
}
void is_malloc_ok(link *p)
{
if(*p == NULL)
{
printf("malloc is error!\n");
exit (-1);
}
}
void creat_new_node(link *p)
{
*p = (link)malloc(sizeof(Node));
is_malloc_ok(p);
}
void insert_link(link *tmp, char name[], char age)
{
link p;
creat_new_node(&p);
strcpy(p->name, name);
p->age = age;
p->next = *tmp;
*tmp = p;
}
link connect(link *man, link *woman)
{
link tmp = NULL;
tmp = *man;
if(tmp == NULL)
{
return *woman;
}
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = *woman;
return *man;
}
void display(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
printf("%s %d\n", tmp->name, tmp->age);
tmp = tmp->next;
}
}
void release(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
tmp = tmp->next;
free(p);
p = tmp;
}
printf("空间回收成功!\n");
}
link rank(link *student)
{
link p1 = NULL;
link p2 = NULL;
int tmp;
char string[N];
p2 = p1 = *student;
while(p2 != NULL)
{
while(p1->next != NULL)
{
if(p1->age > p2->age)
{
tmp = p1->age;
p1->age = p2->age;
p2->age = tmp;
strcpy(string, p1->name);
strcpy(p1->name, p2->name);
strcpy(p2->name, string);
}
p1= p1->next;
}
p1 = *student;
p2 = p2->next;
}
return *student;
}
int main()
{
link man = NULL;
creat_link(&man);
link woman = NULL;
creat_link(&woman);
insert_link(&man, "zhangsan", 18);
insert_link(&man, "lisi", 20);
insert_link(&man, "wangwu", 13);
insert_link(&woman, "zhangyun", 17);
insert_link(&woman, "zhaofei", 21);
insert_link(&woman, "songjiang", 16);
link student = connect(&man, &woman);
student = rank(&student);
printf("学生:\n");
display(student);
release(student);
return 0;
}
【题目】将上题中建立的链表进行反转,实现按年龄的逆序排列
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define N 10
struct node
{
char name[N];
int age;
struct node * next;
};
typedef struct node Node;
typedef struct node * link;
void creat_link(link *head)
{
*head = NULL;
}
void is_malloc_ok(link *p)
{
if(*p == NULL)
{
printf("malloc is error!\n");
exit (-1);
}
}
void creat_new_node(link *p)
{
*p = (link)malloc(sizeof(Node));
is_malloc_ok(p);
}
void insert_link(link *tmp, char name[], char age)
{
link p;
creat_new_node(&p);
strcpy(p->name, name);
p->age = age;
p->next = *tmp;
*tmp = p;
}
link connect(link *man, link *woman)
{
link tmp = NULL;
tmp = *man;
if(tmp == NULL)
{
return *woman;
}
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = *woman;
return *man;
}
void display(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
printf("%s %d\n", tmp->name, tmp->age);
tmp = tmp->next;
}
}
void release(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
tmp = tmp->next;
free(p);
p = tmp;
}
printf("空间回收成功!\n");
}
link reverse_rank(link *student)
{
link p1 = NULL;
link p2 = NULL;
int tmp;
char string[N];
p2 = p1 = *student;
while(p2 != NULL)
{
while(p1->next != NULL)
{
if(p1->age < p2->age)
{
tmp = p1->age;
p1->age = p2->age;
p2->age = tmp;
strcpy(string, p1->name);
strcpy(p1->name, p2->name);
strcpy(p2->name, string);
}
p1= p1->next;
}
p1 = *student;
p2 = p2->next;
}
return *student;
}
int main()
{
link man = NULL;
creat_link(&man);
link woman = NULL;
creat_link(&woman);
insert_link(&man, "zhangsan", 18);
insert_link(&man, "lisi", 20);
insert_link(&man, "wangwu", 13);
insert_link(&woman, "zhangyun", 17);
insert_link(&woman, "zhaofei", 21);
insert_link(&woman, "songjiang", 16);
link student = connect(&man, &woman);
student = reverse_rank(&student);
printf("学生:\n");
display(student);
release(student);
return 0;
}
【题目】在上面的实现的新链表中,给定一个年龄,迅速查找和该学生年龄最接近的学生姓名
提示:使用双向链表
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define N 10
struct node
{
char name[N];
int age;
struct node * next;
struct node * perior;
};
typedef struct node Node;
typedef struct node * link;
void creat_link(link *head)
{
*head = NULL;
}
void is_malloc_ok(link *p)
{
if(*p == NULL)
{
printf("malloc is error!\n");
exit (-1);
}
}
void creat_new_node(link *p)
{
*p = (link)malloc(sizeof(Node));
is_malloc_ok(p);
}
void insert_link(link *tmp, char name[], char age)
{
link p;
creat_new_node(&p);
strcpy(p->name, name);
p->age = age;
if(*tmp == NULL)
{
p->next = NULL;
p->perior = NULL;
*tmp = p;
return;
}
p->next = *tmp;
p->perior = NULL;
(*tmp)->perior = p;
*tmp = p;
}
link connect(link *man, link *woman)
{
link tmp = NULL;
tmp = *man;
if(tmp == NULL)
{
return *woman;
}
while(tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = *woman;
return *man;
}
void release(link p)
{
link tmp;
tmp = p;
while(tmp != NULL)
{
tmp = tmp->next;
free(p);
p = tmp;
}
printf("空间回收成功!\n");
}
void display(link student)
{
link tmp = NULL;
tmp = student;
while(tmp != NULL)
{
printf("%s %d\n", tmp->name, tmp->age);
tmp = tmp->next;
}
}
void find(link *student)
{
link p = NULL;
int a[N], min, j, k, flag, m, i= 0;
p = *student;
printf("请输入年龄:\n");
scanf("%d", &j);
while(p != NULL)
{
a[i] = p->age - j;
if(a[i] < 0)
{
a[i] = 0 - a[i];
}
p = p->next;
i++;
}
min = a[0];
for(k = 0; k < i; k++)
{
if(a[k] < min)
{
min = a[k];
flag = k;
}
}
p = *student;
for(m = 0; m < flag; m++)
{
p = p->next;
}
printf("最相近的学生名字为:%s\n", p->name);
}
int main()
{
link man = NULL;
creat_link(&man);
link woman = NULL;
creat_link(&woman);
insert_link(&man, "zhangsan", 21);
insert_link(&man, "lisi", 20);
insert_link(&man, "wangwu", 13);
insert_link(&woman, "zhangyun", 17);
insert_link(&woman, "zhaofei", 24);
insert_link(&woman, "songjiang", 16);
link student = connect(&man, &woman);
display(student);
find(&student);
release(student);
return 0;
}