数据结构单链表初始化,插入,删除,等操作的实现

#include
#include
#define bool int
typedef int ElemType;
typedef struct LNode
{
     
	ElemType data ;
	struct LNode *next;
}LinkList;

void InitList_L(LinkList *L)//初始单链表
{
     
	L=(LinkList *)malloc(sizeof(LinkList));
	L->next=NULL;
}

void CreateList_L(LinkList *&L,ElemType a[],int n)//头插法初始化链表元素
{
     
	LinkList *s;//定义指向数据元素指针
	int i;
	L=(LinkList *)malloc(sizeof(LinkList));
	L->next=NULL;//创建头结点
	for(i=0;i<n;i++)
	{
     
		s=(LinkList *)malloc(sizeof(LinkList));/*生成新结点*/
		s->data=a[i];/*使新结点数据域的值为a[i]*/
		s->next=L->next;/*将新节点插入到原先结点之前,头结点之后*/
		L->next=s;
	}
}

void CreatList_L1(LinkList *&L,ElemType a[],int n)//尾插法
{
     
	LinkList *s,*r;/*数据域指针和指向表尾的指针*/
	int i;
	L=(LinkList *)malloc(sizeof(LinkList));/*创建头结点*/
	r=L;/*r始终指向尾结点,开始是指向头结点*/
	for(i=0;i<n;i++)
	{
     
		s=(LinkList *)malloc(sizeof(LinkList));
		s->data=a[i];
		r->next=s;
		r=s;/*r始终指向尾结点*/
	}
	r->next=NULL;
}	

void printf_L(LinkList *L)//显示单链表元素
{
     
	LinkList *p=L->next;/*p指向第一个结点*/
	while(p!=NULL)
	{
     
		printf("%4d",p->data);
		p=p->next;
	}
	printf("\n");
}
 bool Listlength_L(LinkList *L)//单链表长度
{
     
	LinkList *p=L;
	int n=0;
	while(p)
	{
     
		p=p->next;
		n++;
	}
	return n;
}

bool GetElem(LinkList *L,int i,ElemType &e)/*获取逻辑位置i的数值域*/
{
     
	LinkList *p=L;
	int j=0;
	while(p && j<i)
	{
     
		p=p->next;
		j++;
	}
	if(p==NULL)
		return -1;
	else
	{
     
		e=p->data;
		return e;
	}
}

bool LocateElem_L(LinkList *L,ElemType e)
{
     /*在单链表中从头开始找第一个值域与e相等的结点*/
	LinkList *p=L->next;
	int i=1;
	while(p && p->data!=e)
	{
     
		p=p->next;
		i++;
	}
	if(p==NULL)
		return -1;
	else
		return i;
}

bool ListInsret_L(LinkList *&L,int i,ElemType e)
{
     /*插入数据元素。应当找出逻辑位置为i的元素的前驱*/
	LinkList *p=L,*s;
	int j=0;
	while(p && j<i-1)
	{
     
		p=p->next;
		j++;
	}
	if(p==NULL)
		return -1;
	else
	{
     
		s=(LinkList *)malloc(sizeof(LinkList));
		s->data=e;
		s->next=p->next;
		p->next=s;
		return 0;
	}
}

bool ListDelet_L(LinkList *&L,int i,ElemType &e)
{
     /*在单链表中,删除第i个结点,并由e返回其数据域值*/
	LinkList *p=L,*q;
	int j=0;
	while(p && j<i-1)
	{
     
		p=p->next;
		j++;
	}
	if(p==NULL)
		return -1;
	else
	{
     
		q=p->next;
		if(q==NULL)
		return -1;
		else
		{
     
			e=q->data;
			p->next=q->next;
			free(q);
			return e;
		}
	}
}

void delmaxnode_L(LinkList *&L)/*删除单链表中元素值最大的结点*/
{
     
	LinkList *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
	while(p)
	{
     
		if(maxp->data<p->data)
		{
     
			maxp=p;
			maxpre=pre;
		}
		pre=p;
		p=p->next;
	}
	if(maxp!=NULL)
	{
     
		maxpre->next=maxp->next;
		free(maxp);
	}
}

int main()
{
     
	LinkList *La;
	ElemType c;
	InitList_L(La);
	int a[]={
     1,2,3,4,5,6};
	CreateList_L(La,a,6);
	printf("头插法单链表元素显示为:\n");
	printf_L(La);
	CreatList_L1(La,a,6;
	printf("尾插法单链表元素显示为:\n");
	printf_L(La);
	printf("单链表长度为%d\n",Listlength_L(La));
	printf("单链表第2个位置元素的数值域为%d\n",GetElem(La,2,c));
	printf("值域为2的元素的第一个逻辑位置为%d\n",LocateElem_L(La,2));
	ListInsret_L(La,3,10);
	printf("插入新的元素后单链表为:\n");
	printf_L(La);
	printf("删除逻辑位置3的元素值为%d\n",ListDelet_L(La,3,c));
	printf("删除元素后单链表为:\n");
 printf_L(La);
	delmaxnode_L(La);
	printf("删除最大元素后的链表元素为:\n");
	printf_L(La);
	return 0}

执行结果如下:
数据结构单链表初始化,插入,删除,等操作的实现_第1张图片

你可能感兴趣的:(数据结构)