单链表的各种操作

本文包含以下内容:

0.单链表的结点struct设置及头结点的建立

1.前插法创建单链表

2.尾插法创建单链表

3.前插新结点

4.尾插新结点

5.遍历单链表

6.删除第 i 个结点

7.取第 i 个结点数据域的值

8.查找ElemType e 所在的结点,并返回该结点的地址值

9.源代码


0.单链表的结点struct设置及头结点的建立

  初始化(建立单链表的第一个结点),最好在main里面进行,若单独用一个函数进行初始化,分配到的内存在函数结束一段时间以后会被自动收回。头结点可以数据域可以为空,也可存放链表的长度等信息。

  定义结点struct:

 

typedef int ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

或者

typedef struct ElemType
{
    int    data_1;
    char   data_2;
}ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

本文用第一种struct

 

1.前插法创建单链表

 

void head_Create_List(LinkList L,int n) //前插法创建单链表
{
	int i;
	LNode *p;
	
	for(i=0;i<n;i++)//n个结点
	{
		p=(LNode *)malloc(sizeof(LNode));
		p->data=i;
		p->next=L->next;
		L->next=p;
	}
	L->data=n;//第0个结点的数据域可以存放链表的长度
}

 

2.尾插法创建单链表

void tail_Create_List(LinkList L,int n)//尾插法创建单链表
{
	int i;
	LNode *p,*r;
	r=L;
	for(i=0;i<n;i++)
	{
		p=(LNode *)malloc(sizeof(LNode));
		p->data=i;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	L->data=n;
}

                尾插法比前插法多一个指针*r,用于指向链表的尾结点。

3.前插新结点

这部当时漏做了,在后续的循环双向链表中补上

4.尾插新结点

这部也漏做了,在后续的循环双向链表中补上

5.遍历单链表

void Traversal_LinkList(LinkList L)//遍历单链表
{
	LNode *p;
	p=L->next;
	while(p != NULL)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}

6.删除第 i 个结点

void ListDelete(LinkList L,int i)//删除第 i 个结点,头结点为第 0 结点
{
	LNode *p,*D;
	p=L;
	int j;
	while( (p->next) && (j<i-1) )
	{
		p=p->next;
		j++;
	}
	if( !(p->next) || (j>i-1) )
	{
		printf("The location of delete is wrong!\n");
		return ;
	}
	
	D=p->next;
	p->next=D->next;
	free(D);
}

7.取第 i 个结点数据域的值

void GetElem(LinkList L, int i, ElemType* e)//取第 i 个结点数据域的值
{
	LNode *p;
	p=L;
	int j=1;
	
	while((p->next) && (j<i+1))
	{
		p=p->next;
		j++;
	}
	if(!(p->next) || (j>i+1))
	{
		printf("The location of GetElem is wrong!\n");
		return ;
	}
	*e= p->data;
}

8.查找ElemType e 所在的结点,并返回该结点的地址值

//查找ElemType e 所在的结点,并返回该结点的地址值,更新LinkList_num
LNode *LocateElem(LinkList L, ElemType e,int *LinkList_num)
{
	int i=0;
	LNode *p=L;
	while( p && p->data != e)
	{
		p=p->next;
		i++;
	}
	if(p)	
	{
		*LinkList_num =i;
		//printf("元素%d 在第 %d 个结点!\n",e,i);
	}
	else
	{
		printf("%d is Not in this LinkList!\n",e);
		p=NULL;
	}
	
	return p;
}

9.源代码

/************************************************************/
/*		             author:givemeway						*/
/*					 time:2020-0730							*/
/*				  email:624745042@qq.com					*/
/*															*/
/*															*/
/*															*/
/************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef int ElemType;

typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;


//void InitList(LinkList L);//初始化链表
//这一步要在main里面做,单独用一个函数做的话,分配到的内存过一段时间就会被自动收回

void head_Create_List(LinkList L,int n);//前插法创建单链表
void tail_Create_List(LinkList L,int n);//尾插法创建单链表

void head_ListInsert(LinkList L,int i, ElemType e);//前插新结点
void tail_ListInsert(LinkList L,int i, ElemType e);//尾插新结点

void ListDelete(LinkList L,int i);//删除第 i 个结点

void Traversal_LinkList(LinkList L);//遍历单链表

void GetElem(LinkList L, int i, ElemType* e);//取第 i 个结点数据域的值

//查找ElemType e 所在的结点,并返回该结点的地址值
LNode *LocateElem(LinkList L, int e,int *LinkList_num);


int main()
{
	LinkList L_head,L_tail,L_location;
	
	ElemType LinkList_num=0;
	
	ElemType *EE;
	EE =(ElemType *)malloc(sizeof(ElemType));
	
	L_head=(LinkList )malloc(sizeof(LNode));
	L_head->next=NULL;
	
	head_Create_List(L_head,MAX);
	Traversal_LinkList(L_head);
	
	ListDelete(L_head,2);
	Traversal_LinkList(L_head);
	
	GetElem(L_head,6,&LinkList_num);
	printf("GetElem(L_head,6,&LinkList_num)-->LinkList_num= %d\n",LinkList_num);
	
	L_location=LocateElem(L_head,5,&LinkList_num);
 	if(L_location != NULL)
		printf("元素%d 在第 %d 个结点!\n",L_location->data,LinkList_num);
	//printf("L_location->data=%d\n",L_location->data);
	
	L_tail=(LinkList )malloc(sizeof(LNode));
	L_tail->next=NULL;
	
	tail_Create_List(L_tail,MAX);
	Traversal_LinkList(L_tail);
	ListDelete(L_tail,3);
	Traversal_LinkList(L_tail);
	GetElem(L_tail,6,EE);
	printf("GetElem(L_tail,6,EE)--> *EE=%d\n",*EE);
	
	L_location=LocateElem(L_tail,11,&LinkList_num);

	if(L_location != NULL)
		printf("元素%d 在第 %d 个结点!\n",L_location->data,LinkList_num);
	//printf("L_location->data=%d\n",L_location->data);
	
	return 0;
}

/* void InitList(LinkList* L)
{
	L=(LinkList *)malloc(sizeof(LNode));
	L->next=NULL;
} */

void head_Create_List(LinkList L,int n) //前插法创建单链表
{
	int i;
	LNode *p;
	
	for(i=0;i<n;i++)
	{
		p=(LNode *)malloc(sizeof(LNode));
		p->data=i;
		p->next=L->next;
		L->next=p;
	}
	L->data=n;
}

void tail_Create_List(LinkList L,int n)//尾插法创建单链表
{
	int i;
	LNode *p,*r;
	r=L;
	for(i=0;i<n;i++)
	{
		p=(LNode *)malloc(sizeof(LNode));
		p->data=i;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	L->data=n;
}

void Traversal_LinkList(LinkList L)//遍历单链表
{
	LNode *p;
	p=L->next;
	while(p != NULL)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}

void ListDelete(LinkList L,int i)//删除第 i 个结点,头结点为第 0 结点
{
	LNode *p,*D;
	p=L;
	int j;
	while( (p->next) && (j<i-1) )
	{
		p=p->next;
		j++;
	}
	if( !(p->next) || (j>i-1) )
	{
		printf("The location of delete is wrong!\n");
		return ;
	}
	
	D=p->next;
	p->next=D->next;
	free(D);
}


void GetElem(LinkList L, int i, ElemType* e)//取第 i 个结点数据域的值
{
	LNode *p;
	p=L;
	int j=1;
	
	while((p->next) && (j<i+1))
	{
		p=p->next;
		j++;
	}
	if(!(p->next) || (j>i+1))
	{
		printf("The location of GetElem is wrong!\n");
		return ;
	}
	*e= p->data;
}



//查找ElemType e 所在的结点,并返回该结点的地址值,更新LinkList_num
LNode *LocateElem(LinkList L, ElemType e,int *LinkList_num)
{
	int i=0;
	LNode *p=L;
	while( p && p->data != e)
	{
		p=p->next;
		i++;
	}
	if(p)	
	{
		*LinkList_num =i;
		//printf("元素%d 在第 %d 个结点!\n",e,i);
	}
	else
	{
		printf("%d is Not in this LinkList!\n",e);
		p=NULL;
	}
	
	return p;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值