| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 700 人关注过本帖
标题:帮忙看一下两个程序时间复杂度
只看楼主 加入收藏
NV77
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2009-11-9
结帖率:66.67%
收藏
 问题点数:0 回复次数:2 
帮忙看一下两个程序时间复杂度
第一个


#include<stdio.h>
#include<malloc.h>
typedef struct lnode//单链表结点类型
{
    int data;
    struct lnode *next;
}list,*linklist;
void initList(linklist &l)//单链表初始化
{
    char c;
    linklist p;
    l=(linklist)malloc(sizeof(list));
    l->next=0;
    while((c=getchar())!='\n')
    {
        p=(linklist)malloc(sizeof(list));//新建结点p插入l
        p->data=c-48;
        p->next=l->next;
        l->next=p;
    }
}
void traverselist(linklist l)//单链表遍历并输出
{
    l=l->next;
              while(l!=0)
    {
        printf("%d",l->data);
        l=l->next;
    }
}
void add(linklist &l,linklist l1,linklist l2)//单链表相加
{
    int a,b=0;
    linklist p;
    l1=l1->next;
    l2=l2->next;
    l=(linklist)malloc(sizeof(list));
    l->next=0;
    while(l1!=0&&l2!=0)//相同数位上均不为零
    {
       a=l1->data+l2->data+b;
        l1=l1->next;
        l2=l2->next;
        b=a/10;
        a=a%10;
        p=(linklist)malloc(sizeof(list));
        p->data=a;
        p->next=l->next;
        l->next=p;
    }
    if(!l1&&!l2)//两个相加结点均为空
    {
        if(b==1)
        {
            p=(linklist)malloc(sizeof(list));
            p->data=1;
            p->next=l->next;
            l->next=p;
        }
    }
    if(l1)//l1存在,l2为空
    {
        while(l1!=0)
        {
            a=l1->data+b;
            l1=l1->next;
            b=a/10;
            a=a%10;
            p=(linklist)malloc(sizeof(list));
            p->data=a;
               p->next=l->next;
            l->next=p;
        }
        if(b==1)
        {
            p=(linklist)malloc(sizeof(list));
            p->data=1;
            p->next=l->next;
            l->next=p;
        }
    }
    if(l2)//l2存在,l1为空
    {
        while(l2!=0)
        {
            a=l2->data+b;
            l2=l2->next;
            b=a/10;
            a=a%10;
            p=(linklist)malloc(sizeof(list));
             p->data=a;
            p->next=l->next;
             l->next=p;
        }
        if(b==1)
        {
            p=(linklist)malloc(sizeof(list));
             p->data=1;
            p->next=l->next;
            l->next=p;
        }
    }
}
void main()//主函数
{
    linklist l1,l2,l3;
    printf("请输入第一个整数:\n");
    initList(l1);
              printf("请输入第二个整数:\n");
    initList(l2);
    printf("两个整数的和是:\n");
              add(l3,l1,l2);
              traverselist(l3);
              printf("\n");
}



第二个


#include <stdio.h>
#include <stdlib.h> //整数变成字符型
#include <string.h> //字符串操作
#define NULL 0
#define ERROR -1
#define STACKSIZE 20  //栈长
//站的定义
typedef struct
{
    char stackname[20];
    char *base;
    char *top;
}Stack;
//变量声明
Stack OPTR, OPND; //定义运算符栈和操作数栈
char expr[255] = ""; //定义字符串
char *ptr = expr;
//栈的初始化
int InitStack(Stack *s, char *name)
{
    s->base=(char *)malloc(STACKSIZE*sizeof(char)); //为栈底分配空间
    if(!s->base) exit (ERROR);                      //分配失败
    strcpy(s->stackname, name);                     //字符串拷贝
    s->top=s->base;                                 //空栈
    return 1;
}
//In
int In(char ch)
{
    return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
//入栈
int Push(Stack *s,char ch)
{
    char *name = s->stackname;
    if(strcmp(name, "OPND") == 0)
    printf("\tPUSH(%s, %d)", name, ch);
    else
    printf("\tPUSH(%s, %c)", name, ch);
    *s->top=ch;
    s->top++;
    return 0;
}
//出栈
char Pop(Stack *s)
{
    char p;
    printf("\tPOP(%s)", s->stackname);
    s->top--;
    p=*s->top;
    return (p);
}
//取栈顶
char GetTop(Stack s)
{
    char p=*(s.top-1);
    return (p);
}
//判定运算符栈的栈顶运算符和输入运算符之间的优先级
char Precede(char c1,char c2)

{
    int i=0,j=0;
    static char array[49]={
    '>', '>', '<', '<', '<', '>', '>',
    '>', '>', '<', '<', '<', '>', '>',
    '>', '>', '>', '>', '<', '>', '>',
    '>', '>', '>', '>', '<', '>', '>',
    '<', '<', '<', '<', '<', '=', '!',
    '>', '>', '>', '>', '!', '>', '>',
    '<', '<', '<', '<', '<', '!', '='};
     switch(c1)
      {
      //i为下面array的横标
       case '+' : i=0;break;
       case '-' : i=1;break;
       case '*' : i=2;break;
       case '/' : i=3;break;
       case '(' : i=4;break;
       case ')' : i=5;break;
       case '#' : i=6;break;
      }
      switch(c2)
      {
       //j为下面array的纵标
      case '+' : j=0;break;
      case '-' : j=1;break;
      case '*' : j=2;break;
      case '/' : j=3;break;
      case '(' : j=4;break;
      case ')' : j=5;break;
      case '#' : j=6;break;
      }
      return (array[7*i+j]); //返回运算符
}
//进行二元运算a op b,op为运算符集合
int Operate(int a,char op,int b)
{
    printf("\tOPERATE(%d, %c, %d)", a, op, b);
    switch(op)
    {
        case '+' : return (a+b);
        case '-' : return (a-b);
        case '*' : return (a*b);
        case '/' : return (a/b);
    }
}
//表达式的计算(算符优先法)
int EvalExpr( )
{
    char c,theta,x,m,ch;
    int a,b;
    c = *ptr++;
    while(c!='#'||GetTop(OPTR)!='#')
    {
        if(!In(c)) //不是运算符,则进操作数栈
        {
        m=atoi(&c);
        Push(&OPND,m);
        c = *ptr++;
        }
        else
        switch(Precede(GetTop(OPTR),c))
        {
            case '<': //栈顶元素优先权低
            Push(&OPTR,c);
            c = *ptr++;
            break;
            case '=': //托括号并接受下一字符
            x=Pop(&OPTR);
            c = *ptr++;
            break;
            case '>': //退栈并将运算结果入站
            theta=Pop(&OPTR);
            b=Pop(&OPND); a=Pop(&OPND);
            Push(&OPND,Operate(a,theta,b));
            break;
        }
    }
    return GetTop(OPND); //返回操作数栈的栈顶元素
}
//主函数
main( )
{
    printf("Input the expression(end with \"#\" sign):");
    do
    {
        gets(expr);
    }
    while(!*expr); //do...while...循环 读取输入数据
    InitStack(&OPTR, "OPTR");     //初始化运算符栈
    Push(&OPTR,'#');              //首先将"#"入站
    InitStack(&OPND, "OPND");     //初始化操作数栈
    printf("\n\nresult:%d\n", EvalExpr());
    return;
}
搜索更多相关主题的帖子: 时间 
2009-12-01 23:35
kingcheng
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-12-28
收藏
得分:0 
这么长
2010-01-01 00:34
flylee
Rank: 5Rank: 5
等 级:职业侠客
帖 子:309
专家分:374
注 册:2004-8-10
收藏
得分:0 
太长了,我只看了第一个程序,是计算大整数相加的吧?我大致看了一下,没有涉及多重循环,复杂符是n?
2010-01-04 19:29
快速回复:帮忙看一下两个程序时间复杂度
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070262 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved