链表和队列编程3
来源:互联网 发布:蔡依林 整容 知乎 编辑:程序博客网 时间:2024/06/05 21:07
【题目】利用链表实现一个先入后出的栈结构,并提供栈操作的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 5struct 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 10struct 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 10struct 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 10struct 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 10struct 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;}
0 0
- 链表和队列编程3
- 链表和队列编程1
- 链表和队列编程2
- 队列和链表
- 队列和链表
- 链表和队列
- 循环队列和链表队列代码
- 数据结构:链表和队列
- 链表和队列复习
- 栈、队列和链表
- 数据结构编程笔记九:第三章 栈和队列 链队列的实现
- 循环队列和链队列
- 循环队列和链队列
- 顺序队列和链队列
- java 实现数组队列和链表队列
- 队列--链表队列
- 数组和链表、栈和队列
- 自主编程实现数组队列和链式队列
- HDU 1285 确定比赛名次【拓扑排序入门题,链式前向星建图】
- linux问题汇总
- ubuntu下面启动重启停止mysql服务
- MyEclipse开发使用Hibernate出现The type java.lang.Object cannot be resolved It is indirectly referenced ...
- android xml布局文件入门
- 链表和队列编程3
- log_martians
- 性能测试工具wrk
- POJ 1611 DisjointSet
- ss命令
- windows C/C++移植linux(1)-目录操作
- Redux 学习笔记 --- node.js开发
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- android studio 启动时候报:java.lang.IllegalStateException: failed to create a child event loop 问题解决