多项式的表示和计算

   设计一种用单链表存储多项式的结构,每个结点存储一项的系数和指数(类型都是int),并编写一个产生多项式链表的函数和一个实现两个多项式相加的函数。
  实例解析:
  用单链表存储每一项的数据,则链表结点的结构应含有三个成员:系数、指数和后继的指针。定义结构如下:
1
2
3
4
5
6
struct 
Node
{
    
int 
coef;
    
int 
power;
    
struct 
Node *link;
};
  用链表存储多项式时,若系数不为0,则结点存在,若系数为0,则不保留该结点。要注意的是:做加法运算时,因有些结点不存在,所以要比较两个结点所存的次数是否一致。
  主要程序代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
  #include <
malloc
.h>
  #define MAX_CHARS_PER_LINE 10
  
typedef 
struct 
Node *PNode;
  
typedef 
struct 
Node *LinkList;
  
//创建单链表(带头结点),若创建失败,返回NULL
  LinkList createList(
void
)
  { LinkList llist;
  
char 
buffer[MAX_CHARS_PER_LINE];
  
int 
coef,power;
  
llist = createNullList();
  
if
(llist == NULL)
    
return 
NULL;
  
fgets
(buffer,MAX_CHARS_PER_LINE,stdin);
//输入数据,空格隔开
  
sscanf
(buffer,
"%d %d"
,&coef,&power); 
//从buffer中取得数据
  
while
(coef != 0 || power != 0){
    
if
(coef != 0)
     
if
(append(llist,coef,power)){  
//若向链表加结点失败
        
freelist(llist);    
//释放整个链表
        
return 
NULL;
      
}
    
fgets
(buffer,MAX_CHARS_PER_LINE,stdin);
    
sscanf
(buffer,
"%d %d"
,&coef,&power);
  
}
  
return 
llist;
  }
  
//以下是其他几个函数的定义
  LinkList createNullList(
void
)
  {LinkList llist;
 
llist = (PNode)
malloc
(
sizeof
(
struct 
Node));
 
if
(llist != NULL)
    llist->link = NULL;
 
return 
llist;
  }
  
//追加结点的函数,成功返回0
  
int 
append(LinkList llist,
int 
coef,
int 
power)
  { PNode pnode;
  
pnode = llist;
  
while
(pnode->link != NULL)
    
pnode = pnode->link;
  
pnode->link = (PNode)
malloc
(
sizeof
(
struct 
Node));
  
pnode = pnode->link;
  
if
(pnode != NULL){
    
pnode->coef = coef;
    
pnode->power = power;
    
pnode->link = NULL;
  
}
  
return 
pnode == NULL;
  }
  LinkList add(LinkList a, LinkList b)
//建立链表存储表达式的和
  {LinkList c;
 
PNode cur_a,cur_b;
 
c = createNullList();
 
if
(c == NULL)
   
return 
NULL;
 
cur_a = a->link;
 
cur_b = b->link;
 
while
(cur_a != NULL && cur_b != NULL){
   
if
(cur_a->power > cur_b->power){
     
if
(append(c,cur_a->coef, cur_a->power)){
       
freelist(c);
       
return 
NULL;
     
}
     
cur_a = cur_a->link;
   
}
   
else 
{
     
if
(cur_a->power < cur_b->power){
       
if
(append(c, cur_b->coef, cur_b->power)){
         
freelist(c);
         
return 
NULL;
       
}
       
cur_b = cur_b->link;
     
}
     
else
{
       
if
(append(c,cur_a->coef+cur_b->coef,cur_a->power)){
            
freelist(c);
            
return 
NULL;
       
}
       
cur_a = cur_a->link;
       
cur_b = cur_b->link;
     
}
   
}
   }
 
if
(cur_a != NULL){       
//若a表达式还有未处理完的项
   
while
(cur_a != NULL){
     
if
(append(c, cur_a->coef, cur_a->power)){
       
freelist(c);
       
return 
NULL;
     
}
     
cur_a = cur_a->link;
   
}
 
}
 
if
(cur_b != NULL){     
//若b表达式还有未处理完的项
   
while
(cur_b != NULL){
     
if
(append(c, cur_b->coef, cur_b->power)){
       
freelist(c);
       
return 
NULL;
     
}
     
cur_b = cur_b->link;
   
}
 
}
 
return 
c;
  }
  
int 
main()
  { LinkList a,b,c;
  
printf
(
"Please input a:"
);          
//输入0 0表示结束
  
if
((a = createList()) == NULL){
     
printf
(“Create List a fail\n”);
     
return 
0;
    }
  
printf
(
"Please input b:"
);
  
if
((b = createList()) == NULL){
     
printf
(“Create List b fail\n”);
       freelist(a);
     
return 
0;
    }
    
if
((c = add(a,b)) == NULL)
     
printf
(“Create List c fail\n”);
    
else 
{
       print(c);      
//输出链表c
       freelist(c);
    }
    freelist(a);
    freelist(b);
  
return 
0;
  }

十进制数化为二进制
   编程,将一个十进制非负整数,化为二进制(使用栈操作)。
  实例解析:
  十进制数化为二进制的方法,是将十进制数反复除以2,直到商为0。每次相除的余数倒排,便是所求的二进制数。
  显然,利用栈操作最方便:将每次相除得到的余数入栈,然后将余数依次出栈输出。
  程序代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
  #include <
malloc
.h>
  #define DataType 
int
  #define MAX_SEQSTACK 100
  
struct  
SeqStack{   
// 顺序栈类型定义
    
int 
MAXNUM;       
//栈最多容纳的元素个数
  
int 
t;           
// t<MAXNUM,表示已经有了第t个数据,自0计数
  
DataType  *s;   
//用来指向栈底元素
  };
  
typedef  
struct 
SeqStack  *PSeqStack;  
//顺序栈类型的指针类型
  PSeqStack CreateEmptyStack_seq()
  { PSeqStack  p;
  
p = (PSeqStack)
malloc
(
sizeof
(
struct 
SeqStack));
  
if
(p == NULL)
    
return 
NULL;
    p->MAXNUM = MAX_SEQSTACK;
  
p->t = -1;         
//不能等于0,若等于0,意味着有了第0个数据
  
p->s = (DataType*)
malloc
(
sizeof
(DataType)*(p->MAXNUM));
  
if
(p->s == NULL){
      
free
(p);
      
return 
NULL;
    }
   
return 
p;
  }
  
void 
push_seq(PSeqStack pastack,DataType x) 
//在栈中压入x
  {
if
(pastack->t >= pastack->MAXNUM - 1)
     
printf
"Overflow! \n" 
);
   
else
{
   
pastack->t = pastack->t + 1;
   
pastack->s[pastack->t] = x;
 
}
  }
  
void 
pop_seq(PSeqStack pastack)    
//删除栈顶元素
  {
if
(pastack->t == -1)
   
printf
(
"Underflow!\n"
);
   
else
   
pastack->t = pastack->t - 1;
  }
  
int 
isEmptyStack_seq(PSeqStack pastack)
  { 
return 
pastack->t == -1;
  }
  DataType top_seq(PSeqStack pastack)  
//栈不空时,求栈顶元素
  { 
return 
(pastack->s[pastack->t]);
  }
  
void 
print_bin(
int 
dec_number)
  { PSeqStack pastack;
  
int 
temp = dec_number;
  
if
(temp < 0){
     
printf
(
"Error!\n"
);
     
return 
;
  
}
  
pastack = CreateEmptyStack_seq();
  
if
(pastack == NULL)
    
return
;
  
while
(temp > 0){     
//若商大于0,继续循环
    
push_seq(pastack, temp%2);  
//余数入栈
    
temp /= 2;                     
//继续除以2
  
}
  
while
(!isEmptyStack_seq(pastack)){
    
printf
(
"%d"
, top_seq(pastack)); 
//输出栈顶值
    
pop_seq(pastack);                  
//删除栈顶元素
  
}
  
free
(pastack->s);               
//释放栈
   
free
(pastack);                  
//释放结构体变量
  }
  
int 
main()
  { 
int 
a;
  
printf
(
"Please input a number:\n"
);
  
scanf
(
"%d"
, &a);
  
print_bin(a);
  
return 
0;
  }

检查括号配对
   假设表达式中包含圆括号、方括号和花括号三种括号。试编写一个函数,判断表达式中的括号是否正确配对。
  实例解析:
  依次读入数学表达式的各个字符,遇到左括号,入栈;遇到右括号,查看栈顶元素是否与其配对。若配对,出栈;若不配对,返回0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
  #include <
malloc
.h>
  #define DataType 
char
  
//数据定义及以下5个函数的定义与本章实例13相同
  PSeqStack CreateEmptyStack_seq();
  
void  
push_seq(PSeqStack pastack, DataType x);
  
void  
pop_seq(PSeqStack pastack);
  
int 
isEmptyStack_seq(PSeqStack pastack);
  DataType  top_seq(PSeqStack pastack);
  
int 
correct(
char 
*
exp
)
  {
int 
i = 0;
 
DataType x;
 
PSeqStack st;
 
if
((st = CreateEmptyStack_seq()) == NULL)
    
return 
0;
 
do
{
    
x = *(
exp
+i);
    
switch
(x){
      
case 
'{' 
:
     
case 
'[' 
:
     
case 
'(' 
:        
                   
push_seq(st, x);  
//左括号入栈
                   
break
;
      
case 
')'
:  
//遇到有括号
                  
if
(isEmptyStack_seq(st)){  
//若此时栈为空
                     
free
(st->s);    
//释放栈
             
free
(st);    
//释放结构体变量
                     
return 
0;    
//返回0
                    }
           x = top_seq(st);  
//取栈顶值
                  
if
(x != 
'('
){     
//若不匹配
             
free
(st->s);
             
free
(st); 
                     
return 
0;
                    }
                  
pop_seq(st);    
//删除栈顶元素
                  
break
;
      
case 
']'
:
                  
if
(isEmptyStack_seq(st)){
                     
free
(st->s); 
             
free
(st); 
                     
return 
0;
                    }
           x = top_seq(st);
                  
if
(x != 
'['
){
                       
free
(st->s);
             
free
(st); 
                     
return 
0;
                    }
                  
pop_seq(st);
                  
break
;
      
case 
'}'
:
                  
if
(isEmptyStack_seq(st)){
                     
free
(st->s); 
             
free
(st); 
                     
return 
0;
                    }
           x = top_seq(st);
                  
if
(x != 
'{'
) {
             
free
(st->s); 
             
free
(st); 
                     
return 
0;
                    }
                  
pop_seq(st);
                  
break
;
      
default
:
                  
break
;
    
}
    
i++;
 
}
while
(x != 
'\0'
);
   
if
(!isEmptyStack_seq(st)){ 
//若检查结束栈不为空,则左括号多
   
free
(st->s);
    
free
(st); 
   
return 
0;
   }
   
free
(st->s); 
   
free
(st); 
 
return 
1;
  }
  
int 
main()
  { 
char 
exp
[80];
    
gets
(
exp
);
  
if
(correct(
exp
) == 0)
    
printf
(
"Error\n"
);
  
else
    
printf
(
"Ok\n"
);
  
return 
0;
  }