本节设计题目:
1. 建立一个单链表,并存入50个85到100之间的随机数。
2. 分别用递推和递归两种方法分别遍历第一题中的链表。
3. 在第一题的链表中建立一个查找函数struct node* find(int x, struct node* head), 其中head是查找链表的头结点, x 是要查找的数,若找到返回指向该结点的指针,没找到返回空指针。应用该函数查找95以测试该函数。
4. 在第一题的链表中查找90,若找到则在其后插入值为-1的新结点。
5. 在第一题的链表中查找大于95的结点,并在这些结点的前面插入值为-1的新结点。
6. 在第一题的链表中删除大于95的所有结点。
具体基础知识大家可以自行查阅书籍,下面是代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
LNode *next;
}LNode,*LinkList;
//递归函数
void fun(LinkList p)
{
if(p->next == NULL)
{
printf("%d ",p->data);
printf("\n");
printf("遍历结束");
}
else
{
printf("%d ",p->data);
p = p->next;
fun(p);
}
}
//查找函数
LNode *find(int x,LinkList p)
{
int i=1;
while(p != NULL)
{
if(p->data == x)
{
printf("要查找的数在第%d位\n",i);
return p;
}
p = p->next;
i+=1;
}
printf("不存在要查找的数字!\n");
return p;
}
//查找后面插入-1
void *finfAndInsert_end(int x,LinkList p)
{
while(p != NULL)
{
if(p->data == x)
{
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data = -1;
s->next = p->next;
p->next = s;
}
p = p->next;
}
return 0;
}
//查找大于x前面插入-1
void *findAndInsert_before(int x,LinkList p)
{
while(p != NULL)
{
if(p->data > x)
{
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data = p->data;
s->next = p->next;
p->next = s;
p->data = -1;
p = s->next;
}else{
p = p->next;
}
}
return 0;
}
//删除大于x的结点
void deleteLNode(int x,LinkList p)
{
LinkList q;
q = p->next;
while(q != NULL)
{
if(q->data > x)
{
p->next=q->next;
q = p->next;
}else
{
p = p->next;
q = q->next;
}
}
}
int main()
{
int i=0;
int x;
LinkList s,L,p;
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;
/*******************************1、建立单链表,并插入数据*************************************************/
//头插法
// printf("头插入法:\n");
for(i=0;i<50;i++)
{
s=(LinkList)malloc(sizeof(LNode));
s->data = rand()%15+85;
s->next = L->next;
L->next = s;
}
/*
//尾插法
printf("尾插入法:\n")
for(i=0;i<50;i++)
{
s=(LinkList)malloc(sizeof(LNode));
printf("当前插入的数字为:%d\n",rand()%15+85);
s->data = rand()%15+85;
s->next = NULL;
if(L->next == NULL)
{
L->next = s;
s->next = NULL;
}else
{
p = L;
while(p->next != NULL)
{
p = p->next;
}
p->next = s;
}
}
*/
// printf("插入的数为:\n");
/*******************************2、递推和递归法遍历单链表*************************************************/
//递推法遍历
printf("递推法遍历的结果为:\n");
p = L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
printf("遍历结束\n");
//递归法遍历
printf("递归法遍历的结果为:\n");
p = L->next;
fun(p);
printf("\n");
/*******************************3、查找函数*************************************************/
printf("请输入要查找的数字:\n");
scanf("%d",&x);
find(x,L->next);
/*******************************4、查找90,并在后面添加值为-1的新结点*************************************************/
printf("请输入你要执行插入-1的数字:\n");
scanf("%d",&x);
finfAndInsert_end(x,L->next);
printf("插入后的结果为:\n");
p = L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
/*******************************5、查找大于95的结点,并在前面添加值为-1的新结点*************************************************/
printf("请输入你要插入的比较的数字:\n");
scanf("%d",&x);
findAndInsert_before(x,L->next);
printf("插入后的结果为:\n");
p = L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
/*******************************6、删除大于95的所有结点*************************************************/
printf("请输入你要删除的比较的数字:\n");
scanf("%d",&x);
deleteLNode(x,L->next);
printf("删除后的结果为:\n");
p = L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 0;
}
如有问题,请及时提出,谢谢!