题目:3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的新结点成为值为y的结点的前驱结点。 题目来自李云清版《数据结构》
题目代码
#include <stdlib.h>
#include <stdio.h>
typedef struct node
{ int data;
struct node *next;
}linknode,*linklist;
linklist creatlinklist()
{ linklist head,r,s;
int x;
head=r=(linklist)malloc(sizeof(linknode));
printf("\n请输入一组以0结束的整数序列:\n");
scanf("%d",&x);
while (x)
{ s=(linklist)malloc(sizeof(linknode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return head;
}
void print(linklist head)
{ linklist p;
p=head->next;
printf("单链表如下:\n");
while(p)
{ printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
void insert(linklist head,int y,int x)
{
linklist pre,p,s;
pre=head;
p=head->next;
while(p && p->data!=y)
{ pre=p;
p=p->next;
}
if (p)
{ s=(linklist)malloc(sizeof(linknode));
s->data=x;
s->next=p;
pre->next=s;
}
}
void main()
{ linklist head;
int y,x;
head=creatlinklist();
print(head);
printf("\n请输入y与x的值:\n");
scanf("%d %d",&y,&x);
insert(head,y,x);
print(head);
}
实现代码图
代码主要模块
关于创建单链表的代码这里不再叙述了,在求单链表结点数的一章有介绍
void insert(linklist head,int y,int x)
{
linklist pre,p,s;
pre=head;
p=head->next;
while(p && p->data!=y)
{ pre=p;
p=p->next;
}
if (p)
{ s=(linklist)malloc(sizeof(linknode));
s->data=x;
s->next=p;
pre->next=s;
}
}
本代码的思想就是在链表中进行循环,找到y元素,然后在y元素前插入x 此时,指针p是指向y元素的,指针pre是指向y元素的前驱元素
具体过程如下图所示: 如对读者有帮助,作者不胜感激!
|