单链表的一些基本操作

代码展示

#include<stdio.h>
#include<stdlib.h>
//单链表的定义
typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}*LinkList, LNode;
//头插法建立链表
LinkList List_HeadInsert(LinkList&L)
{
	int x = 0;
	LNode*s;
	L = (LinkList)malloc(sizeof(LNode));//创建一个头节点
	L->next = NULL;
	scanf("%d", &x);//输入头节点的数值
	while (9999 != x)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = L->next;
		L->next = s;
		scanf("%d", &x);
	}
	
	return L;
}
//尾插法
LinkList  List_TailInsert(LinkList&L)
{
	int x = 0;
	L = (LinkList)malloc(sizeof(LNode));//建立头指针
	LNode *r=L, *s;//*r为表尾指针
	scanf("%d",&x);
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
}
//打印函数
void Print(LinkList L)
{
	L = L->next;
	while (L!=NULL)
	{
		printf("%3d",L->data);
		L = L->next;
	}
	printf("\n");
}
//查找指定位置的元素的函数
LNode*GetElem(LinkList L, ElemType i)
{
	int j = 1;
	LNode*p = L->next;
	if (i==0)
	{
		return L;
	}
	if (i < 1)
		return NULL;
	while (p&&j<i)
	{
		p=p->next;
		j++;
	}
	return p;
}
//按值查找表节点
LNode*LocateElem(LinkList L,ElemType e)
{
	LNode*p = L->next;
	while (p!=NULL&&p->data!=e)
	{
		p=p->next;
	}
	return p;
}
//插入节点操作
bool ListFrontInsert(LinkList L,int i,ElemType e)
{
	LinkList p = GetElem(L,i-1);
	if (NULL == p)
	{
		return false;
	}
	//为新插入的节申请空间
	LinkList s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}
//删除节点操作
bool ListDelete(LinkList L,int i)
{
	LinkList p = GetElem(L,i-1);
	if (NULL == p)
	{
		return false;
	}
	LinkList q = p->next;
	p->next = q->next;
	free(q);
	q = NULL;
	return true; 
}
  
int main()
{
	LinkList L;//链表头,
	printf("    1.头插法输入数据3,4,5,6,7以9999作为结束标 \n    ");
	List_HeadInsert(L);//输入数据3,4,5,6,7,9999
	Print(L);//打印数据为7,6,5,4,3,
	printf("    2.尾插法输入数据3,4,5,6,7以9999作为结束标 \n    ");
	List_TailInsert(L);
	Print(L);//打印数3,4,5,6,7
	printf("       3.按序号查找节点值\n                       ");
	printf("请输入你要查找第几个的节点:");
	int x = 0;
	scanf("%d",&x);
	LinkList search=GetElem(L,x);
	if (search != NULL)
	{
		printf("按序号查找成功!\n");
		printf("%d",search->data);
	
	}
	printf("\n");
	printf("          4.按值查找表节点\n                         ");
	printf("请输入你要查找的元素:");
	scanf("%d", &x);
	LinkList search1 = LocateElem(L, x);
	if (search != NULL)
	{
		printf("按值查找成功!\n");
		printf("%d", search1->data);

	}
	printf("\n");
	printf("            5.插入接点操作\n                           ");
	printf("请输入你要插入的位置和值:");
	int plot = 0;
	ElemType num = 0;
	scanf("%d %d",&plot,&num);
	ListFrontInsert(L,plot,num);
	Print(L);
	printf("               6.删除节点的操作\n                     ");
	printf("请输入你要删除的节点:");
	int del = 0;
	scanf("%d",&del);
	ListDelete(L, del);
	Print(L);
	system("pause");
	return 0;
}

结果展示

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}*LinkList,LNode;
//头插法建立链表
LinkList List_HeadInsert(LinkList &L)
{

	//创建头节点
	printf("头插法建立链表,以9999位结束标志\n");
	ElemType e;
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;
	scanf("%d",&e); 
	while (e!=9999)
	{
		LNode*s = (LNode*)malloc(sizeof(LNode));
		s->data = e;
		s->next = L->next;//用来存放上次开辟节点元素的地址
		L->next = s;//存放刚刚开辟元素的地址
		scanf("%d",&e);
	}
	return L;
}
//查找指定位置的元素的函数
LNode*GetElem(LinkList L,int i)
{
	int j = 1;
	if (i==0)
	{
		return L;
	}
	if (i<1)
	{
		return NULL;
	}
	LNode*p = L->next;
	while (p&&j<i)
	{
		p = p->next;
		j++;
	}
	return p;

}
//尾插
void List_TrailInsert(LNode*&L)
{
	int x = 0;
	printf("尾插法建立链表,以9999位结束标志\n");
	//建立头节点
	L = (LinkList)malloc(sizeof(LNode));
	LNode*r = L, *s;//*r为表尾指针
	scanf("%d",&x);
	while (x!=9999)
	{
		s=(LinkList)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
}
//插入节点操作
LNode* ListFrontInsert(LinkList &L, int i, ElemType e)
{
	LinkList p = GetElem(L,i-1);
	if (NULL == p)
	{
		return NULL;
	}
	LinkList s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return L;
}

//打印函数
void Print(LNode*L)
{
	L = L->next;
	while (L!=NULL)
	{
		printf("%3d",L->data);
		L=L->next;
	}
	printf("\n");
}
//按值查找表节点
int LocateElem(LinkList L, ElemType e)
{
	int j = 1;
	LNode*p = L->next;
	while (p != NULL&&p->data != e)
	{
		p = p->next;
		j++;
	}

	return j;

}
//删除节点操作
LinkList ListDelete(LinkList& L, int i)
{
	LinkList p = GetElem(L,i-1);
	if (NULL == p)
	{
		return NULL;
	}
	LinkList q = p->next;
	p->next = q->next;
	free(q);
	q = NULL;
	return L;
}
//链表头
LinkList L;
void test1()
{
	List_HeadInsert(L);

	Print(L);
}
void test2()
{
	List_TrailInsert(L);
	Print(L);
}
void test3()
{
	List_TrailInsert(L);
	printf("查找第二个节点元素的值\n");
	LNode*search=GetElem( L,2);
	if (search!=NULL)
	{
		printf("按序号查找成功!\n");
		printf("%3d", search->data);
	}
	printf("\n");
}
void test4()
{
	List_TrailInsert(L);
	printf("元素为4所在节点的位置\n");
	int j=LocateElem(L, 4);
	printf("所在的位置%3d\n",j);
}
void test5()
{
	List_TrailInsert(L);
	printf("在第2个位置插入元素为4值\n");
	ListFrontInsert(L, 2, 4);
	Print(L);
}
void test6()
{
	List_TrailInsert(L);
	printf("在把第2个位置的元素删除\n");
	ListDelete(L, 2);
	Print(L);
}
int main()
{
	test1();
	test2();
	test3();
	test4();
	test5();
	test6();
	system("pause");
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值