链表和队列编程3


【题目】利用链表实现一个先入后出的栈结构,并提供栈操作的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 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;
}





            










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值