c语言链表的基本操作

众所周知,链表是数据结构中线性表的知识,线性表有两种存储结构,一种是顺序存储(顺序表),一种是链式存储(链表)。现在给出链表中常用基本操作的c语言代码实现。

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode //定义链表类型
{
	ElemType data;  //数据域 
	struct LNode *next;  //指针域 
	
 }LNode,*LinkList; 
 void CreateList(LinkList &L,int n) //初始化链表 
 {	int i;
 	LinkList p,r;  //p表示指向当前节点的指针 
 	L=(LinkList )malloc(sizeof(LNode));
 	L->next=NULL;  //建立头结点
 	L->data=0;  //表头数据域放的是长度 
	 r=L; //创建尾结点 
 	printf("输入n个数放到链表里:\n"); 
 	for(i=0;i<n;i++)
 	{
 		p=(LinkList)malloc(sizeof(LNode));  //为新建立的节点申请空间 
 		scanf("%d",&p->data); //输入数据 
 		L->data++;
 		r->next=p; //把新建的节点放到尾解点之后 
 		r=p; //新建的节点等于尾解点 
	 }
 }
 void print(LinkList L)  //链表的打印函数 
 {  int i;LinkList p;
 	p=L->next;
 	for(i=0;i<L->data;i++)
 	{printf("%d ",p->data);
 	 p=p->next;
	 }
 }
int GetElem(LinkList L,int i,ElemType &e)  //从链表中获取元素 
{	int j=1;
	LinkList p;
	p=L->next;
	if(!p||i>L->data)  //如果表为空或查询位置超出长度 
	return 0;
	while(p&&j<i)  //将p移到要找到的位置 
	{ p=p->next;
	  j++;
	}
	e=p->data;  //找到后赋值 
	return 1;
 } 
int ListInsert(LinkList &L,int i,ElemType e)  //链表节点的插入 
 {  LinkList p,s;
 	int j=0; //j为循环变量 
	 p=L;  //p为当前节点的指针 
	
	 while(p&&j<i-1)
	 { p=p->next;
		j++;
	}
	if(!p||i>L->data+1)  //如果表为空或查询位置超出长度 
	return 0;
	 s=(LinkList)malloc(sizeof(LNode));  //创建新节点 
	 s->data=e;     //新节点赋值 
	 s->next=p->next;
	 p->next=s;
	 L->data++;  //插入完之后长度加1 
	 return 1; 	
  } 
int ListDelete(LinkList &L,int i,ElemType &e)  //链表节点的删除 
{
	LinkList p,s; //p为要删除的前一个节点,s为要删除的节点 
	int j=0;
	p=L;
	if(!p||i>L->data)  //如果表为空或查询位置超出长度 
	return 0;
	while(p&&j<i-1) //p移动到正确位置 
	{ p=p->next;
	  j++;
	}
	s=p->next; //s移动到正确位置 
	e=s->data; //把删除的数据赋值给e 
	p->next=s->next; 
	L->data--;
	free(s); //释放节点 
	return 1; 
 } 
 int LocateElem(LinkList L,ElemType e) //在链表中查找与e相等的元素并返回元素位置 
{	int i;
	LinkList p;
	p=L->next;
	for(i=0;i<L->data;i++)
	{
		if(p->data==e)
		return i+1;
		p=p->next;
	}
	return 0;
 }
 int DestoryList(LinkList &L) //链表的销毁 
 {
 	LinkList p;
 	if(L=NULL)
 	return 0;
 	while(L)
 	{ p=L->next;
 	  free(L);
 	  L=p;
	 }
	return 1;
  } 
 void menu()
{	printf("\n-------------------------------------1.构造一个新链表----------------------------------------------------------");
	printf("\n-------------------------------------2.向表中插入元素----------------------------------------------------------");
	printf("\n-------------------------------------3.向表中删除元素----------------------------------------------------------");
	printf("\n-------------------------------------4.获取表中元素------------------------------------------------------------");
	printf("\n-------------------------------------5.打印表中元素-------------------------------------------------------------");
   	printf("\n-------------------------------------6.获取链表长度----------------------------------------------------------");
	printf("\n-------------------------------------7.销毁链表-------------------------------------------------------------");
 } 
 int main()
 {	ElemType e; 
 	LinkList L;
 	int m,choose,location;
 	menu();
    p:
	printf("\n请输入你的选项: ");
	scanf("%d",&choose);
	switch(choose) 
	{ case 1: printf("输入要创建链表的元素个数n:"); scanf("%d",&m);CreateList(L,m);goto p;  //创建m个长度的链表 
	  case 2:printf("\n请输入要插入元素的位置:");scanf("%d",&location);printf("\n请输入要插入的元素:");scanf("%d",&e);ListInsert(L,location,e);goto p; 
	  case 3:printf("\n请输入要删除元素的位置:");scanf("%d",&location);ListDelete(L,location,e);printf("\n被删除的数是%d\n",e); goto p;	
	  case 4:printf("\n请输入要获取元素的位置:");scanf("%d",&location);GetElem(L,location,e);printf("\n获取到的数是%d\n",e); goto p; 
      case 5:print(L); goto p;
      case 6:printf("表长为:%d",L->data);  goto p;
      case 7:DestoryList(L);printf("\n线性表已被销毁"); goto p;
      default:printf("输入错误,请重新输入"); goto p; 
	}

    return 0;
  } 

上述便为常见的链表操作代码。
下面给出运行结果图
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔梦圆的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值