2020考研408数据结构算法 链表系列操作

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

话不多说直接上代码!


#include
#include
/**
	设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点 
*/
typedef  int Elemtype;
typedef struct LNode{

	Elemtype data;
	struct LNode *next;
 }LNode,*LinkList;

 //头插法建立单链表
 //生成链表中元素顺序和输入元素顺序相反 
 LinkList createLinkListHead(LinkList &L){
 	int n;
 	Elemtype x; 
	L = (LNode *)malloc(sizeof(LNode));
	if(L==NULL){
 	    printf("申请空间失败"); 
	}
	L->next = NULL;
	printf("输入单链表的个数:\n");
	scanf("%d",&n) ;
	printf("输入结点的值:\n");
	for (int i = 0; idata = x;
		p->next = L->next;
		L->next = p;
	}	
	return L;	
}
//尾插法建立单链表
 //生成链表中元素顺序和输入元素顺序相同
LinkList createLinkListStern(LinkList &L){
	//从表头到表尾正向建立单链表L,每次均在表尾插入元素 
	
	int n; 
	Elemtype x;
	L=(LinkList)malloc(sizeof(LNode));	
	printf("输入单链表的个数:\n");
	scanf("%d",&n) ;
	printf("输入结点的值:\n");
	LNode *s,*r=L;//r为表尾指针
//	scanf("%d",&x);//输入结点的值 
	for (int i = 0; idata = x;
		r->next = s;
		r=s;          //r指向新的表尾结点 
	
	}	 
	r->next=NULL;//尾结点指针置空 
	return L;	
}
 
 void deleteElem(LinkList &L,Elemtype x)
 {
 	LNode *p;//p指向待删除的结点 
 	if(L==NULL){//递归出口 
 		return;
 		
	 }
	if(L->data==x){//若 L所指结点的值为x 
		p=L;//删除*L,并让L指向下一结点 
		L=L->next;
		free(p);
		deleteElem(L,x);//递归调用 
		
	}else{//若L所指向的结点均不为x 
		deleteElem(L->next,x);//递归调用 
	}
 	
 	
 } 
//输出链表的值
void display(LinkList &L)//遍历
{
	LNode *p;
	printf("输出单链表:\n");
	for (p=L->next; p!=NULL;p =p->next)
	{
		printf("元素:%d ", p->data);
	}
} 

int main()
{
	LinkList L1,L2;
	//头插法建立单链表 
	printf("*************************头插法建立单链表*******************\n "); 
 	createLinkListHead(L1);
	printf("原始链表:\n");
	display(L1); 
	deleteElem(L1,3);
	printf("删除后:\n");
	display(L1); 
 	
	//尾插法建立单链表 
	printf("**************************尾插法建立单链表*****************\n "); 
	createLinkListStern(L2);
	printf("原始链表:\n");
	display(L2);
	deleteElem(L2,3);
	printf("删除后:\n");
	display(L2);
	
	
	return 0;
 } 

实验结果:

2020考研408数据结构算法 链表系列操作_第1张图片

你可能感兴趣的:(2020考研408数据结构算法 链表系列操作)