免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 929 | 回复: 0
打印 上一主题 下一主题

第五周:C语言总复习,数据结构作业 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览
1. C语言总复习:略
2.链表作业: 利用链表进行多项式合并,例如:
Y1:5+6x+8x^2+32x^3
Y2: 2x-8x^2+16x^4
合并: 5+8x+32x^3+16x^4

multinomial.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  TIME    4

typedef struct NODE_ST_Y{
    char sign;
    int value;
    int power;
    struct NODE_ST_Y *next;
}node_st_y;


int add(node_st_y **root, node_st_y data)
{

    node_st_y *new;
    node_st_y *current;
        current    = *root;

    new = malloc(sizeof(*new));
    *new = data;
    new->next = NULL;
    if(*root == NULL)
    {
        (*root) = new;
        return 0;
    }
    while(current->next != NULL)
        current = current->next;
    current->next = new;
    
    return 0;

}

int delete(node_st_y **root, node_st_y data)
{
    node_st_y *current = *root;
    node_st_y *previous = *root;
    while(current != NULL)
    {
        if(data.value == current->value)
        {
            previous->next = current->next;
            free(current);
            return 0;
        }
        previous = current;
        current = current->next;
    }
    return -1;

}

int insert(node_st_y **root, node_st_y data)
{
    node_st_y *new;
    new = malloc(sizeof(*new));
    *new = data;

    node_st_y *current = *root;
    node_st_y *previous = *root;
    while(current != NULL)
    {    
        if(new->power < current->power)
            {
                new->next = current;
                previous->next = new;
                return 0;
            }
        previous = current;
        current = current->next;
    }
    add(root,data);
}

int display(node_st_y *root)
{
    while(root != NULL)
    {
        printf("+(%dx%d)", root->value, root->power);
        root = root->next;
    }
    return 0;
}

int input(node_st_y *data)
{
    char buffer[20];
    int i=0;
    fgets(buffer,20,stdin);
    if(buffer[0] == '\n')
    {
        return -1;
    }
    if(isalnum(buffer[0]))
        {
         for(i=19;i>0;i--)
             buffer[i]=buffer[i-1];
         buffer[0]=' ';
        }
    sscanf(buffer, "%c%dx%d\n", &data->sign, &data->value ,&data->power);
    if(data->sign == '-')
        data->value *= -1;
    return 0;
}

int together(node_st_y **Y1, node_st_y *Y2)
{
    node_st_y *current_Y1;
    node_st_y *current_Y2;
    node_st_y data;
        current_Y2 = Y2;
    int flag = 0;
    while(current_Y2 != NULL)
    {
        flag = 0;
        current_Y1 = *Y1;
        while(current_Y1 != NULL)
        {
            if(current_Y1->power == current_Y2->power){
                current_Y1->value += current_Y2->value;
                if(current_Y1->value == 0)
                    delete(Y1, *current_Y1);
                flag = 1;
                break;
            }
            current_Y1 = current_Y1->next;
        }
        if(flag ==0)
            insert(Y1, *current_Y2);
        current_Y2 = current_Y2->next;
    }
    return 0;
}

int destroy(node_st_y *Y)
{
    node_st_y *previous ;
    if(Y == NULL)
        return -1;
    while(Y != NULL)
    {
        previous = Y;
        free(Y);
        Y = Y->next;
    }
    return 0;
}



void clear_data(node_st_y *data)
{
    data->sign = ' ';
    data->value = 0;
    data->power = 0;
}

int main(void)
{
    node_st_y data;
    node_st_y *Y1 = NULL;
    node_st_y *Y2 = NULL;

    int i;
    printf("Input Y1:\n");
    for(i=0;i<TIME;i++)
    {
        clear_data(&data);
        if(input(&data)==-1)
            break;
        add(&Y1,data);
    }
    printf("Input Y2:\n");
    for(i=0;i<TIME;i++)
    {
        clear_data(&data);
        if(input(&data)==-1)
            break;
        add(&Y2,data);
    }
    printf("\nY1    :");
    display(Y1);
    printf("\nY2    :");
    display(Y2);
    if(!together(&Y1,Y2))
    {
        printf("\nNew Y1:");
        display(Y1);
    }
    printf("\n");
    destroy(Y1);
    destroy(Y2);
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP