单链表的基本操作

单链表的基本运算

今天来给大家分享一下单链表的基本运算

以下代码如有需要可以直接复制,有运算结果供大家参考,欢迎大家留言评论,同时共同学习,共同进步


前言

以下代码可供刚刚接触数据结构的同学参考,本文介绍了单链表的基础操作。


提示:以下是本篇文章正文内容,下面案例可供参考

1、单链表的类型定义和创建

  1. 类型定义
typedef struct LinkNode
{
	ElemType data;//数据元素
	struct LinkNode *next;//定义一个指针结点,指向下一个元素
}LinkNode;
  1. 用头插法创建单链表
void CreateList(LinkNode *&L,ElemType a[],int n)
{
	LinkNode *s;
	L=(LinkNode *)malloc(sizeof(LinkNode));
	L->next=NULL;
	for(int i=0;i<n;i++)
	{
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->data=a[i];
		s->next=L->next;
		s->next=L->next;
		L->next=s;
	}
 } 

注意:创建的单链表位序与输入位序相反

有兴趣的同学也可以尝试采用尾插法建表

2.九大运算

1.初始化

void InitList(LinkNode *&L)
 {
 	L=(LinkNode *)malloc(sizeof(LinkNode));
 	L->next=NULL;
 }

2.销毁

void DestoryList(LinkNode *&L)
 {
 	LinkNode *pre=L,*p=L->next;//定义一组指针队
 	while(p!=NULL)//当p不为空,执行下面操作
 	{
 		free(pre);//释放p的前驱
 		pre=p;
 		p=p->next; //p后移
	 }
	 free(pre);
 }

3.判断是否为空表

bool ListEmpty(LinkNode *L)
 {
 	if(L->next==NULL)
 	return 0;
 	return 1;
 }

4.求单链表的长度

int ListLength(LinkNode*L)
 {
 	int n=0;
 	LinkNode *p=L;
 	while(p->next!=NULL)
 	{
	 n++;
	 p=p->next;
    }
    return n;
 }

5.打印输出单链表

void DispList(LinkNode *&L)
{
	LinkNode *p=L->next;
	while(p!=NULL)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}

6.求第i个元素的值

int GetElem(LinkNode*L,int i,ElemType &e)//把第i个元素的值存放在e中
 {
 	int j=0;
 	LinkNode *p=L;
 	if(i<1||i>ListLength(L))
 	return 0;//i不在范围内,返回0
 	while(j<i&&p!=NULL)
 	{
 		j++;
 		p=p->next;
	 }
	 if(p==NULL)
	 return 0;//p为空,返回0
	 else
	 {
	 	e=p->data;
	 	return e;//否则返回e
	 }
 }

7.求某个值的位置i

int LocateElem(LinkNode*L,ElemType e)
 {
 	int i=1;
 	LinkNode *p=L;
 	while(p->next!=NULL&&p->data!=e)
 	{
 		p=p->next;
 		i++;
	 }
	 if(p==NULL)
	 return 0;
	 else
	 return i;
  } 

8.插入

bool ListInsert(LinkNode *&L,int i,ElemType e)
{
	int j=0;
	LinkNode *p=L,*s;
	while(j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
	return 0;
	else
	{
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->data=e;
		s->next=p->next;
		p->next=s;
		return 1;
	}
}

9.删除

bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
	int j=0;
	LinkNode *p=L,*q;
	while (j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
	return 0;
	else
	{
		q=p->next;
		if(q==NULL)
		return 0;
		else
		{
			e=q->data;
			p->next=q->next;
			free(q);
		}
		return 1;
	}
}

3.全部代码 包含主函数

如果需要复制可直接复制粘贴以下代码

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LinkNode
{
	ElemType data;
	struct LinkNode *next;
}LinkNode;
void CreateList(LinkNode *&L,ElemType a[],int n)
{
	LinkNode *s;
	L=(LinkNode *)malloc(sizeof(LinkNode));
	L->next=NULL;
	for(int i=0;i<n;i++)
	{
		s=(LinkNode *)malloc(sizeof(LinkNode));
		s->data=a[i];
		s->next=L->next;
		s->next=L->next;
		L->next=s;
	}
 } 
 void InitList(LinkNode *&L)
 {
 	L=(LinkNode *)malloc(sizeof(LinkNode));
 	L->next=NULL;
 }
 void DestoryList(LinkNode *&L)
 {
 	LinkNode *pre=L,*p=L->next;
 	while(p!=NULL)
 	{
 		free(pre);
 		pre=p;
 		p=p->next; 
	 }
	 free(pre);
 }
 bool ListEmpty(LinkNode *L)
 {
 	if(L->next==NULL)
 	return 0;
 	return 1;
 }
 int ListLength(LinkNode*L)
 {
 	int n=0;
 	LinkNode *p=L;
 	while(p->next!=NULL)
 	{
	 n++;
	 p=p->next;
    }
    return n;
 }
void DispList(LinkNode *&L)
{
	LinkNode *p=L->next;
	while(p!=NULL)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	printf("\n");
}
 int GetElem(LinkNode*L,int i,ElemType &e)
 {
 	int j=0;
 	LinkNode *p=L;
 	if(i<1||i>ListLength(L))
 	return 0;
 	while(j<i&&p!=NULL)
 	{
 		j++;
 		p=p->next;
	 }
	 if(p==NULL)
	 return 0;
	 else
	 {
	 	e=p->data;
	 	return e;
	 }
 }
 int LocateElem(LinkNode*L,ElemType e)
 {
 	int i=1;
 	LinkNode *p=L;
 	while(p->next!=NULL&&p->data!=e)
 	{
 		p=p->next;
 		i++;
	 }
	 if(p==NULL)
	 return 0;
	 else
	 return i;
  } 

bool ListInsert(LinkNode *&L,int i,ElemType e)
{
	int j=0;
	LinkNode *p=L,*s;
	while(j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
	return 0;
	else
	{
		s=(LinkNode*)malloc(sizeof(LinkNode));
		s->data=e;
		s->next=p->next;
		p->next=s;
		return 1;
	}
}
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
	int j=0;
	LinkNode *p=L,*q;
	while (j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
	return 0;
	else
	{
		q=p->next;
		if(q==NULL)
		return 0;
		else
		{
			e=q->data;
			p->next=q->next;
			free(q);
		}
		return 1;
	}
}
 int main(){
 int n=0;
 LinkNode *L;
 ElemType a[50];
 int i=0,j=0,x=0,e=0,c=0,k,p;
 int h=0;
 printf("请输入顺序表的长度:\n");
 scanf("%d",&n);
 printf("输入数据表中各个数据元素:\n");
 for(i=0;i<n;i++)
 {
  scanf("%d",&a[i]);
 }
 CreateList(L,a,n);
 printf("建立的线性表为:\n");
 DispList(L);
 	printf("===================================================\n") ;
	printf("               1.插入一个数据。\n");
	printf("               2.删除一个数据。\n") ;
	printf("               3.得到第i个元素的值。\n") ;
	printf("               4.查找某元素的值。\n") ;
	printf("               5.输出线性表的长度。\n");
	printf("               6.判断表是否为空。\n");
	printf("               7.结束。\n");
	printf("===================================================\n") ;
while(h!=7){
printf("选择要进行的操作\n");
scanf("%d",&h);
	 if (h>= 1 && h<= 7) 
		 switch (h)
        {
        case 1:  
			printf("请输入插入的位置i<0~curLen>:\n");
            scanf("%d",&j);
			printf("请输入插入的位值x:\n");
            scanf("%d",&x);
            printf("插入后的顺序表为:\n");
            ListInsert(L,j,x);
            DispList(L);
            break;
        case 2: 
			printf("请输入待删除的位置i<0~curLen>:\n");
            scanf("%d",&c);
            ListDelete (L,c,e);
            printf("删除后的顺序表为:\n");
            DispList(L);
            break;
        case 3:
        	printf("输入要得到第几个元素\n");
        	scanf("%d",&i);
        	GetElem(L,i,k);
        	printf("第%d个元素的值为%d\n",i,k);
            break;
        case 4:
        	printf("输入要查找的元素\n");
        	scanf("%d",&p);
        	LocateElem(L,p);
        	printf("这个元素的位置是%d\n",i+1);
            break;
        case 5:
        	printf("线性表的长度为%d\n",ListLength(L));
        	break;
        case 6:
        	printf("判断是否为空表,输出0是空表,输出1不是空表\n输出的结果是:%d\n",ListEmpty(L));
        	break;
		case 7:break; 
        
	 }
}
 return 0;
}

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了单链表的一些基本运算,大家可以有选择的进行选用。欢迎各大码农给予宝贵的意见和见解。我们共同进步。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值