先写感悟,使用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;
}