--通过这个实现,我想仔细的想想指针在程序中的使用(程序中的单链表是有头的单链表)。
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 struct st_the{
5 int cef;
6 int exp;
7 };
8 typedef struct node_st{
9 struct st_the stu;
10 struct node_st *next;
11
12 }node_p;
13
14 node_p *node_create(int (*arr)[2],int g){
15 node_p *menode,*cur,*mynode;
16 mynode = malloc(sizeof(*mynode));
17
18 cur = mynode;
19 int i = 0;
20 for(i=0;i<g;i++){
21
22 menode = malloc(sizeof(*menode));
23 menode->stu.cef = *(*(arr+i)+0);
24 menode->stu.exp = *(*(arr+i)+1);
25 menode->next = NULL;
26 cur->next = menode;
27 cur = menode;
28 }
29 return mynode;
30 }
32 void node_show(node_p *mynode){
33 node_p *menode = mynode;
34 for(menode = menode->next;menode != NULL;menode = menode->next){
35 printf("%d %d\n",menode->stu.cef,menode->stu.exp);
36
37 }
38
39 }
119 void node_union(node_p *mynode1, node_p *mynode2){
120 node_p *menode1,*menode2,*cur;
121
122 menode1 = mynode1->next;
123 menode2 = mynode2->next;
124 cur = mynode1;
125 while(menode1 && menode2){
126 if(menode1->stu.exp == menode2->stu.exp){
127 menode1->stu.cef +=menode2->stu.cef;
128 if(menode1->stu.cef){
129 cur->next = menode1;
130 cur = menode1;
131 }
132
133 menode1 = menode1->next;
134 menode2 = menode2->next;
135 }
136 else if(menode1->stu.exp > menode2->stu.exp){
137 cur->next = menode2;
138 cur = menode2;
139 menode2 = menode2->next;
140
141
142 }
143
144 else {
145 cur->next = menode1;
146 cur = menode1;
147 menode1 = menode1->next;
148
149
150
151 }
152
153
154 }
155
156 if(menode1 == NULL){
157 cur->next = menode2;
158 cur = menode2;
159 }
160 if(menode2 == NULL){
161 cur->next = menode1;
162 cur = menode1;
163 }
164
165
166
167
168 }
169 int main(){
170 int arr1[][2] = {{2,0},{5,2},{6,4},{8,7},{8,10}};
171 int arr2[][2] = {{-3,0},{-5,2},{4,5},{7,7}};
172
173 int i;
174 node_p *p1,*p2;
175 // int *p = arr1;
176 // int *q = arr2;
177 int (*p)[2];
178 int (*q)[2];
179 p = arr1;
180 q = arr2;
181 /*
182 for(i=0;i<5;i++){
183
184 printf("%d",p[i][0]);
185 printf("%d",p[i][1]);
186 printf("\n");
187 }
188 printf("\n");
189 q = arr2;
190
191 for(i=0;i<4;i++){
192
193 printf("%d",q[i][0]);
194 printf("%d",q[i][1]);
195 printf("\n");
196 }*/
197 p1 = node_create(p,5);
198 p2 = node_create(q,4);
199 #if 0
200
201 for(i=0;i<5;i++){
202
203 p1 = p1->next;
204
205 if(p1 != NULL){
206 printf("%d %d \n",p1->stu.cef,p1->stu.exp);
207 }
208 }
209
210 #endif
211 node_show(p1);
212 printf("\n");
213 node_show(p2);
214 printf("\n");
215 node_union(p1,p2);
216 node_show(p1);
217 exit(0);
220 }
上面的程序可以实现多项式合并。
首先说一下使用单链表来建立一个多项式的问题。
14 node_p *node_create(int (*arr)[2],int g){
15 node_p *menode,*cur,*mynode;
16 mynode = malloc(sizeof(*mynode));
17
18 cur = mynode;
19 int i = 0;
20 for(i=0;i<g;i++){
21
22 menode = malloc(sizeof(*menode));
23 menode->stu.cef = *(*(arr+i)+0);
24 menode->stu.exp = *(*(arr+i)+1);
25 menode->next = NULL;
26 cur->next = menode;
27 cur = menode;
28 }
29 return mynode;
30 }
在这个程序中,实现有头的单链表,首先应该malloc一块空间mynode,在刚开始的时候,我没有注意到这个问题,而是只malloc了menode,对于一个有头的单链表必须malloc一块空间,但是只使用next指针来指向有数据的节点。,而他本身的的数据是空的,而且我对这个函数的参数设置也不满意,我想有空的话应当将使用的数组指针参数改成普通的指针作为参数,另外int g,我觉得没有必要存在,同时我也想测试一下cur 与 mynode是不是可以在将return mynode改成return cur(后来增加:实测不可以这么改,在程序的执行过程中cur移动了,而mynode没有移动,他始终是头节点)。
本来程序应该来说是及其简单的,但是你看我使用的两个while循环来实现的程序,首先应该说先批评一下自己,因为这个函数没能够跑通,总是存在着死循环的问题,这也暴露出我的指针使用的不熟练。就是不出现死循环也会出现指针的指向无法预测的问题,但是也没有办法找到为什么menode2会指向menode1的问题。如果你知道为什么,请您留言告诉我。
下面是又臭又长的程序,请忽略那些printf语句,那些是我用来调错用的, 有点乱:
该函数本身就存在缺陷,比如:只考虑了第二个循环出现指针为空的情况,而没有考虑第一个循环出现指针为空的情况。
40 #if 0
41 node_p *node_union(node_p *mynode1, node_p *mynode2){
42 node_p *menode1 = mynode1;
43 node_p *menode2 = mynode2;
44 node_p *cur,*ret;
45
46
47 cur = menode1;
48 ret = cur;
49 while(menode1->next){
50 printf("54menode1 %d,%d\n",menode1->next->stu.cef,menode1->next->stu.exp);
51 while(menode2->next){
52 sleep(3);
53 printf("57menode2 %d,%d\n",menode2->next->stu.cef,menode2->next->stu.exp);
54 if((menode1->next)->stu.exp == (menode2->next)->stu.exp){
56 printf("meode1%d +menode2 %d\n",menode1->next->stu.cef,menode2->next->stu.cef);
57 (menode1->next)->stu.cef = menode1->next->stu.cef + menode2->next->stu.cef;
58 if(menode1->next->stu.cef >0){
59 // menode1 = menode1->next;
60 cur->next =(menode1->next)->next;
61 cur = menode1->next;
62 printf("-----%d,%d-------\n",menode1->stu.cef,menode1->stu.exp);
63 }
64
65 menode1 = menode1->next;
66
67 menode2 = menode2->next;
68 printf("the menod2 add is %d,%d\n",menode2->next->stu.cef,menode2->next->stu.exp);
69 break;
70
71 }
72 if(((menode1->next)->stu.exp) >(( menode2->next)->stu.exp)){
73
74 printf("mode1 %d, mode2 %d\n",((menode1->next)->stu.exp) ,((
75 menode2->next)->stu.exp));
76 printf("77 the cur2 %d, %d\n",cur->next->stu.cef,cur->next->stu.exp);
77 printf("78 %d >%d\n",(menode1->next)->stu.exp,(menode2->next)->stu.exp);
78 cur->next= menode2->next;
79
80
81 cur = menode2->next;
82 printf("mende====%d,%d\n",menode1->next->stu.cef,menode1->next->stu.exp);
83 menode2 = menode2->next;
84 printf("menode2===%d %d\n",menode2->stu.cef,menode2->stu.exp);
85 /* if(menode2 == NULL){
86 cur->next = menode1->next;
87 cur = cur->next;
88 menode1 = menode1->next;
89 break;
90 }*/
91 }
92 if(((menode1->next)->stu.exp) < ((menode2->next)->stu.exp)){
93 printf("89 %d<%d....\n",menode1->next->stu.exp,menode2->next->stu.exp);
94 cur->next = menode1->next;
95 cur = menode1->next;
97
98 printf("92 cur%d,%d\n",cur->stu.cef,cur->stu.exp);
99 menode1 = menode1->next;
100 // cur->next = menode1;
101 break;
102
103 }
104 }
105
106
107 }
108
109 if(menode2->next == NULL){
110 printf("the menode2 is null\n");
111 cur->next = menode1->next;
112 menode1 = menode1->next;
113 }
114
115 }
116 #endif