严蔚敏版数据结构——单链表

严蔚敏版数据结构——单链表的操作

      记得前上个礼拜,我写过的一个版本的单链表的创建。今天写下了这个严蔚敏版的单链表。梳理了一下思路,其基本算法还是一样的,还是那句话,理解,理解,理解最重要。这个版本的单链表我要提醒自己的是:1、这是直接在函数中采用引用LinkList &   (注意这是引用,不是取指针地址) 对地址进行操作;上个版本是函数返回一个指向结构体指针的指针这种方法;(我还要说明一点:如果这两种方法都不采用,那就要用指向指针的指针,双重指针来操作,当然这是很复杂哦,因为我们的链表说到底就是一个指针,一般我们采用以上两种方法即可)2、记住一点,不改变链表参数传值就行,即链表就行(LinkList head),要操作链表最简单一种做法就是用引用的方法传地址,这不是——指向结构体LNode的指针的地址,而是引用、引用、引用。详情参考下一篇博客 int & 到底是个啥(LInkList  &        head)。

还是那句话,代码是最精简的解释,上代码欣赏。

代码亲测完美运行:

/*
   item是暂时用来遍历元素的指针
    pnew是新创建的结点指针
    pend是链表的尾结点
*/

#include<stdio.h> 
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef struct LNode
{
	int data;
	struct LNode *next;
	
}LNode,*LinkList;

//---------------前插法创建单链表;---------------- 
void CreatList_H(LinkList &head,int n)
{
	int i;LinkList pnew;
	//先建立头结点,数据为空;
	head=(LinkList)malloc(sizeof(LNode)); 
	head->next=NULL;
	for(i=0;i<n;i++)
	{
		pnew=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&pnew->data);
		pnew->next=head->next;
		head->next=pnew;
	}
	
}

//--------------后插法创建单链表 ------------------
void CreateList_E (LinkList &head,int n)
{
	int i;
	LinkList pnew;
	LinkList pend;//定义最后的节点指针; 
	//先建立头结点,数据为空;
	head=(LinkList)malloc(sizeof(LNode)); 
	head->next=NULL;
	pend=head;//头结点是最后的节点 ;
	for(i=0;i<n;i++)
	{
		pnew=(LinkList)malloc(sizeof(LNode));
		printf("请输入第%d个节点的数据:\n");
		scanf("%d",&pnew->data);
		pnew->next=NULL;
		pend->next=pnew;
		pend=pnew; 
		
	} 	
}

//-------------单链表的取值--------------
int  GetElem(LinkList head,int i,LNode &elem ) 
{
	int j=1;
	LinkList item;
	item=head->next;
	while(item&&j<i)
	{
		item=item->next;
		j++;
	}
	if(item==NULL||j>i)// 
	{
		return ERROR;
	}
	elem.data=item->data;
	return OK;
	
}

//-----------------单链表的查找------------------
LinkList LocateElem(LinkList head,LNode elem)
{
	LinkList item;
	item=head->next;
	while(item!=NULL&&item->data!=elem.data)
	{
		item=item->next;
	}
	
	return item;
} 

//------------------插入元素---------------
int  ListInsert (LinkList &head,int i,LNode elem)
{
	LinkList item,pnew;
	int j=0;
	item=head;
	while(item&&(j<i-1))//查询第i-1个结点,item指向它 
	{
		item=item->next;
		++j;
	}
	if(!item||j>i+1)
	return ERROR;
	
	pnew=(LinkList)malloc(sizeof(LNode));
	pnew->data=elem.data;
	pnew->next=item->next;
	item->next=pnew;
	return OK;	 
} 
//------------------打印链表---------------- 
void PrintList(LinkList head)
{
	LinkList item;
	item=head;
	item=item->next;//这一步不是必须要做的,为了跳过头结点(没有数据) 
	while(item!=NULL)
	{
		printf("----%d----\n",item->data);
		item=item->next;
	
	}
}
//--------------删除元素 ------------------- 
	int DeleteElem(LinkList &head,int i)
	{
		LinkList item,del;
		int j=0;
		item=head;
		while((item->next)&&(j<i-1))
		{
			item=item->next;
			++j;
		}
		if(!(item->next)||(j>i-1))
		return ERROR;
		del=item->next;
		//item->next=item->next->next;
		item->next=del->next; 
		delete del;
		return OK;
	} 
int main()
{
	LinkList L;
	LNode e1,e2;//用来测试的
	int n;
    int e2_data;
//-------------创建列表测试------------ 
	printf("输入要创建的链表结点个数:\n");
	scanf("%d",&n);
	printf("输入%d个数据:\n",n);
	CreatList_H(L,n);
    printf("\n打印出来看看!\n"); 
	PrintList(L);
//-----------取值测试 ----------------- 
	printf("输入要取值的位置:\n");
	scanf("%d",&n);
	GetElem(L,n,e1);
	printf("\n--该位置上取出的的数据是-%d--\n",e1.data);
////------------查找测试------------ ---- 
	printf("请输入要查找的元素的值e2:\n");
	scanf("%d",&e2.data);
	e2_data=LocateElem(L,e2)->data; 
	printf("e2该元素上的数据是%d\n",e2_data); 
//-------------删除测试---------------
	printf("请输入要删除元素的位置:\n");
	scanf("%d",&n); 
	DeleteElem(L,n);
	printf("\n删除后的链表如下:\n");
	PrintList(L);
//-----------插入测试----------------
	printf("输入要插入的位置:\n");
	scanf("%d",&n);
	ListInsert(L,n,e2); 
	printf("\n插入后的链表如下:\n");
	PrintList(L);
	return 0;
}

测试

       链表到此完结!

       博主水平不高,如有失误处恳望指出

   

      

猜你喜欢

转载自blog.csdn.net/cj151525/article/details/83033772