学习了数据结构后,才对指针有更深的了解,指针就是C 的灵魂。
1
#include<stdio.h>
2
#include<malloc.h>
3
#define LEN sizeof(Lnode)
4
typedef struct node{ //创建结构体节点
5
int xishu;
6
int zhishu;
7
struct node *next;
8
}Lnode,*Linklist;
9
void main(){
10
char s;
11
Linklist ha,hb,hc;
12
Linklist creat();
13
void out(Linklist);
14
Linklist add(Linklist,Linklist);
15
start:
16
printf("求多项式A,B的和\n");
17
printf("请输入多项式A,按要求输入(指数按升序输入).\n以系数输入0表示结束\n");
18
ha=creat();//创建A
19
//输出A
20
printf("A的结果为:\n A=");
21
out(ha);printf("\n");
22
printf("请输入多项式B,按要求输入(指数按升序输入).\n以系数输入0表示结束\n");
23
hb=creat();//创建B
24
//输出B
25
printf("B的结果为:\n B=");
26
out(hb);
27
printf("\n");
28
hc=add(ha,hb);
29
printf("A+B的和为:");
30
out(hc);
31
printf("\n");
32
printf("是否继续(y/n)? :");
33
scanf("%s",&s);
34
if(s=='y')
35
goto start;
36
} //main结束
37
//创建多项式函数
38
Linklist creat(){
39
Lnode *p,*s;
40
Linklist h;
41
int c,a0,i=1;
42
s=(Lnode*)malloc(LEN);
43
p=s;h=s;
44
p->xishu=NULL;
45
printf("请输入a0:");
46
scanf("%d",&a0);
47
s=(Lnode*)malloc(LEN);
48
p->next=s;
49
p=p->next;
50
p->xishu=a0;
51
p->zhishu=NULL;
52
p->next=NULL;
53
while(1){
54
s=(Lnode*)malloc(LEN);
55
printf("请输入第%d个系数:",i);
56
scanf("%d",&c);
57
if(c==0)
58
break;
59
p->next=s;
60
p=s;
61
p->xishu=c;
62
printf("请输入第%d个系数对应的x的指数:",i);
63
scanf("%d",&c);
64
p->zhishu=c;
65
p->next=NULL;
66
i++;
67
}
68
return h;
69
}
70
//多项式输出函数
71
void out(Linklist h){
72
Lnode *p;
73
int a=0,b=0; //a判断是否用"+”,b是否整个多项式为0
74
p=h->next;
75
while(p!=NULL){
76
if(p->zhishu==NULL && p->xishu!=0){
77
printf("%d",p->xishu);
78
b=1;
79
p=p->next;a=1;
80
continue;
81
}
82
else if(p->xishu<0){
83
if(p->xishu==-1)
84
printf("-X");
85
else
86
printf("%dX",p->xishu);
87
b=1;a=1;
88
if(p->zhishu!=1)
89
printf("^%d",p->zhishu);
90
91
}
92
else if(p->xishu>0){
93
if(a==1)printf("+");
94
if(p->xishu!=1) printf("%d",p->xishu);
95
printf("X");b=1;
96
if(p->zhishu!=1) printf("^%d",p->zhishu);
97
a=1;
98
}
99
p=p->next;
100
}
101
if(b==0)
102
printf("0");
103
}
104
//多项式A,B相加的函数add()
105
Linklist add(Linklist ha,Linklist hb){
106
Linklist hc; //定义c的头节点
107
Lnode *pa,*pb,*pc,*t;
108
pa=ha->next;pb=hb->next;
109
hc=ha;pc=hc;
110
free(hb);
111
while(pa && pb){
112
if(pa->zhishu!=NULL && pb->zhishu==NULL){//a无常数项,b有
113
pb=pb->next;
114
break;
115
}
116
else if(pa->zhishu==NULL && pb->zhishu!=NULL){//b无常数项,a有
117
pa=pa->next;
118
pc=pc->next;
119
break;
120
}
121
else if(pa->zhishu==NULL && pb->zhishu==NULL){//a,b都有常数项
122
pa->xishu=pa->xishu+pb->xishu;
123
pa=pa->next;pb=pb->next;
124
pc=pc->next;
125
}
126
else if(pa->zhishu > pb->zhishu){//a的指数项大
127
pc->next=pb;
128
pc=pc->next;
129
pb=pb->next;
130
pc->next=NULL;
131
}
132
else if(pa->zhishu<pb->zhishu){//b的指数项大
133
pc->next=pa;
134
pc=pc->next;
135
pa=pa->next;
136
pc->next=NULL;
137
}
138
else{ //a,b的指数相同
139
pa->xishu=(pa->xishu)+(pb->xishu);
140
if(pa->xishu==0){ //和为0,删节点
141
t=pa;
142
pa=pa->next;
143
free(t);
144
}
145
else{
146
pc->next=pa;
147
pc=pc->next;
148
pa=pa->next;
149
}
150
t=pb;
151
pb=pb->next;
152
pc->next=NULL;
153
free(t);
154
}
155
}//while 结束
156
if(pa)
157
pc->next=pa;
158
else
159
pc->next=pb;//剩余的结点加到链表
160
return hc;
161
}//add函数结束
162

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

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162
