单链表实现多项式的组合--指针和链表

--通过这个实现,我想仔细的想想指针在程序中的使用(程序中的单链表是有头的单链表)。 

  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
                                                                       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值