C语言实现数据机构单链表(头插法)

#include <stdio.h>
#include <malloc.h>

 typedef struct LNode
 {
    
    
	int data;
	struct LNode *next;			//指向后继元素; 
 } LinkNode;
 
 void CreateList(LinkNode *&L,int a[],int n)
 {
    
    
 	LinkNode *s;
 	L = (LinkNode*)malloc(sizeof(LinkNode));
 	L->next = NULL;
	//为了实现头插法与现实的数组排列顺序相同,这里将for循环从大到小,实现顺序调换 
	for(int i=n-1; i>=0; i--) 
	{
    
    
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = a[i];
		s->next	= L->next;
		L->next = s;
	} 
 }
 
 void DispList(LinkNode *L)
 {
    
    	
 	LinkNode *p = L;
 	printf("顺序表为:(");
	while(p->next != NULL)
	{
    
    	
		p = p->next;
		if(p->next!=NULL)
		{
    
    
			printf("%d,",p->data);
		}
		else
		{
    
    
			printf("%d",p->data);	
		}
	}	
	printf(")\n");
 }
 
 bool ListEmpty(LinkNode *L)
 {
    
    
 	if(L->next!=NULL)
 	{
    
    
 		printf("此表不为空表\n");
	 }
	 else
 	{
    
    
 		printf("此表为空表\n");
	 }
 }
 
 int ListLength(LinkNode *L)
 {
    
    
 	int len = 0;
 	LinkNode *p = L;
 	while(p->next != NULL)
 	{
    
    
 		p = p->next;
 		len++;
	 }
 	printf("当前的链表长度为:%d\n\n",len);
  } 
 
 int GetElem(LinkNode *L,int a,int &e)
 {
    
    
 	int n=1;
 	LinkNode *p = L->next;
 	while(n<a && p!=NULL)		//p!=NULL很重要,p=NULL意思是指针p为空,不存在data和next,
	{
    
     							//因此如果不加这句后面的p=p->next本身就不存在了,就会出错 
 		n++;
 		p = p->next;
	}
	
	if(a<=0 || p == NULL)
	{
    
    
		printf("超出搜索范围\n\n");
	}
	else
	{
    
    
		e = p->data;
		printf("该链表位于第%d位置的元素为:%d\n\n",a,e); 
	}
 }
 
 
 int LocateElem(LinkNode *L,int a,int &e)
 {
    
    
 	int n=0;
 	LinkNode *p = L;
 	while(p != NULL && p->data!=a)			//这里要注意&&是短路与,因此p!=NULL应该要先放前面,否则报错 
 	{
    
    
 		p=p->next;
 		n++;
	}
	if(p == NULL)
	{
    
    
		printf("该链表不存在这一元素\n\n");
	}
	else
	{
    
    
		e = n;
		printf("该元素在链表的位置为:%d\n\n",e);
	}
 }

bool ListInsert(LinkNode *L,int a,int c)
{
    
    
	LinkNode *s,*p=L;
	int i = 1;
	while(i<a && p!=NULL)
	{
    
    
		i++;
		p = p->next;
	}
	if(a<=0||p==NULL)
	{
    
    
		printf("超出插入范围\n");
	}
	else
	{
    
    
		s = (LinkNode *)malloc(sizeof(LinkNode));
		s->data = c;
		s->next = p->next;
		p->next = s;
	 }
	 DispList(L);
	 ListLength(L);
}
 
 bool ListDelete(LinkNode *L,int a)
{
    
    
	LinkNode *q,*p=L;
	int i = 0,e;
	while(i<a-1 && p!=NULL)
	{
    
    
		i++;
		p = p->next;
	}
	if(a<=0 || p==NULL)
	{
    
    
		printf("超出删除范围\n");
	}
	else
	{
    
    
		q = p->next;
		if(q==NULL)
		{
    
    
			return(printf("超出删除范围\n\n"));
		}
		e = q->data;
		p->next = q->next;
		free(q);
		printf("被删除的元素为%d\n",e);
	 }
	 DispList(L);
	 ListLength(L);
}
  
 void DestroyList(LinkNode *L)
 {
    
    
 	LinkNode *pre=L,*p=L->next;
 	while(p!=NULL)
 	{
    
    
 		free(pre);
 		pre = p;
 		p = pre->next;
	}
 	free(pre);
 	ListLength(L);
 	printf("销毁成功"); 
 }
 
 int main()
 {
    
    
 	LinkNode *L;
 	
 	int m; 
	printf("请输入要创建的数组元素个数:");
	scanf("%d",&m);
	int u[m];
	
	for(int i=0; i<m; i++)
	{
    
    	
		int h;
		printf("请输入第%d个元素的值:",i+1);
		scanf("%d",&h);
		u[i] = h;
	}
 	
 	CreateList(L,u,m);
 	DispList(L);
 	ListEmpty(L);
 	ListLength(L);
 	
 	int a,e;
 	printf("请输入要搜索的元素位置:");
	scanf("%d",&a);
 	GetElem(L,a,e);
 	
 	int b,e_1;
 	printf("请输入要定位的元素:");
	scanf("%d",&b);
 	LocateElem(L,b,e_1);
 	
 	int c,d;
 	printf("请输入要插入的元素:");
	scanf("%d",&c);
	printf("请输入要插入的元素位置:");
	scanf("%d",&d);
 	ListInsert(L,d,c);
 	
 	int i;
	printf("请输入要删除的元素位置:");
	scanf("%d",&i);
	getchar();
 	ListDelete(L,i);
 	
 	char C;
 	printf("是否要置空该链表(是/C)?\n");
	scanf("%c",&C);
	if(C =='C')
	{
    
    
		DestroyList(L);
	}
 	
 }
               

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/The_RedMaple/article/details/109027449