数据结构之单链表的基本操作

本节设计题目:

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;
}
如有问题,请及时提出,谢谢!

猜你喜欢

转载自blog.csdn.net/zly412934578/article/details/79081201