链表和队列编程3

来源:互联网 发布:蔡依林 整容 知乎 编辑:程序博客网 时间:2024/06/05 21:07


【题目】利用链表实现一个先入后出的栈结构,并提供栈操作的pushpop的接口



/*****************************************************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