先写感悟,使用strcmp函数时,传入的时指针,或者字符串。对应的需要给变量添加&,而单个字符的比较不需要这么复杂。
再者,指针插入操作的时候,如果是原有链表的指针,直接使用赋值就好,不要用指向下一个的操作,否则程序会变得很奇怪。
最烦的是devc++的调试链表的时候不能看到具体的内容,只能凭自己去猜bug。
吐槽Moodle网站,什么**,怎么不去死。教学需要和实际完全脱离。趁早run吧。
代码如下。
#include <stdio.h> #include <stdlib.h> #include <string.h> //旧三新五? typedef struct Node{ ?? ?int data;//数量? ?? ?char no;//编号? ?? ?struct Node*next; }Node;
Node *start(Node*head){ ?? ?head=(Node*)malloc(sizeof(Node)); ?? ?head->next=NULL; ?? ?return head; }
Node *create(Node*head,int n){ ?? ?Node*tail,*p;//tail是尾节点,p是中间节点 ?? ?tail=head; ?? ?int i=0; ?? ?for(i=0;i<n;i++){ ?? ??? ?p=(Node*)malloc(sizeof(Node)); ?? ??? ?scanf("%c",&p->no); ?? ??? ?if(p->no==',')scanf("%c",&p->no); ?? ??? ?scanf("%d",&p->data); ?? ??? ?getchar(); ?? ??? ?tail->next=p; ?? ??? ?tail=p; ?? ?} ?? ?tail->next=NULL; }
void join(Node*old,Node*ne){ ?? ?Node*pre1,*pre2;//p1,pre1指old,p2,pre2指ne ?? ?pre1=old; ?? ?pre2=ne; ?? ?int i=0; ?? ?if(pre1==old)pre1=pre1->next; ?? ?if(pre2==ne)pre2=pre2->next; ?? ?while(pre2->next!=NULL){ ?? ??? ?//pre1和pre2相等 ?? ??? ?if(pre1->no==pre2->no){ ?? ??? ??? ?//pre1,p1指针不动? ?? ??? ??? ?pre1->data=pre1->data+pre2->data; ?? ??? ??? ?pre2=pre2->next; ?? ??? ??? ?continue; ?? ??? ?} ?? ??? ?//pre1比较小 ?? ??? ?else if(pre1->no<pre2->no&&pre1->next!=NULL){ ?? ??? ??? ?//且p1的no比pre2大? ?? ??? ??? ?//插入操作 ? ?? ??? ??? ?if(pre1->next->no>pre2->no){ ?? ??? ??? ??? ?Node*p; ?? ??? ??? ??? ?p=pre2->next; ?? ??? ??? ??? ?pre2->next=pre1->next;; ?? ??? ??? ??? ?pre1->next=pre2; ?? ??? ??? ??? ?pre1=pre2; ?? ??? ??? ??? ?pre2=p; ?? ??? ??? ??? ?continue; ?? ??? ??? ?} ?? ??? ??? ?//p1和pre2一样大? ?? ??? ??? ?else if(pre1->next->no==pre2->no){ ?? ??? ??? ??? ?pre1=pre1->next; ?? ??? ??? ??? ?pre1->data+=pre2->data; ?? ??? ??? ??? ?pre2=pre2->next; ?? ??? ??? ??? ?continue; ?? ??? ??? ?} ?? ??? ??? ?else{ ?? ??? ??? ??? ?pre1=pre1->next; ?? ??? ??? ?}?? ??? ??? ? ?? ??? ?} ?? ??? ?//pre1无后续节点? ?? ??? ?else{ ?? ??? ??? ?pre1->next=pre2; ?? ??? ??? ?pre2=pre2->next; ?? ??? ?} ?? ?} ?? ?//pre2的最后一个元素 ?? ?//相等情况? ?? ?if(pre1->no==pre2->no){ ?? ??? ?pre1->data+=pre2->data; ?? ?} ?? ?//pre1更大? ?? ?else{ ?? ??? ?if(pre1->next==NULL){ ?? ??? ??? ?pre1->next=pre2; ?? ??? ??? ?pre1=pre1->next; ?? ??? ??? ?pre1->next=NULL; ?? ??? ?} ?? ?} ?? ?return; }
void printo(Node*old){ ?? ?Node*p; ?? ?p=old; ?? ?p=p->next; ?? ?while(p->next!=NULL){ ?? ??? ?printf("%c%d,",p->no,p->data); ?? ??? ?p=p->next; ?? ?} ?? ?printf("%c%d",p->no,p->data); ?? ?printf("\n"); }
int main(){ ?? ?Node*old,*ne; ?? ?old=start(old); ?? ?ne=start(ne); ?? ?create(old,3); ?? ?//printo(old); ?? ?create(ne,5); ?? ?//printo(ne); ?? ?join(old,ne); ?? ?printo(old); ?? ?return 0; }
|