已知整型链表,设计算法,在所有结点值为x的结点前插入结点值为y的结点,插入的结点个数通过函数值返回。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{ //用Node代替struct node
int a;
struct node *next;
}Node,*LinkList;
LinkList create();
LinkList find_pre(LinkList h,int x);
int fun1(LinkList h,int x,int y,LinkList q);//声明函数
LinkList create(){
LinkList h,r,s;
h=(LinkList)malloc(sizeof(Node)); //设立头结点
r=h;
int a;
scanf("%d",&a); //先输入一次a
while(a!=1){ //设立a!=1为循环结束条件
s=(LinkList)malloc(sizeof(Node)); //设立一个新的结点为存放数据和建立链表做准备
s->data=a; //把数据存放在s的data域中
r->next=s; //头指针的next域存放下一个结点的地址
r=s; //r跟随s;
scanf("%d",&a);
}r->next=0; //尾结点的next域存放0;
return h; //返回头结点地址作为整个链表的地址
}
LinkList find_pre(LinkList h,int x){ //求前导
LinkList p=h->next,q=h;
while(p&&p->data!=x){
q=p;
p=p->next; //q永远指向p的前导
}return q;
}
int fun1(LinkList h,int x,int y,LinkList q){
LinkList p=h->next,s;
int count=0;
while(p){
if(p->data==x){
s=(LinkList)malloc(sizeof(Node)); //建立一个新的结点
s->data=y;
s->next=q->next; //让q的后继变成我的后继
q->next=s; //把我变成q的后继
count++; //计数
q=find_pre(p,x);
}p=p->next; //为下一次循环做准备
}return count;
}
int main(){
LinkList head,p,q;
head=create();
q=find_pre(head,5);
printf("%d\n",fun1(head,5,10,q));
for(p=head->next;p;p=p->next){ //此处不能使用p++
printf("%d",p->data); //遍历输出,查看链表是否正确
}return 0;
}
标签:LinkList,结点,int,练习,next,链表,data
From: https://blog.51cto.com/u_16036037/6168613