王道数据结构:单链表上基本操作的实现(C语言版)

数据结构 专栏收录该内容
20 篇文章 13 订阅

单链表:

线性表的链式存储又称单链表,它是通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,除存放元素自身的信息外,还需要存放一个指向其后继的指针。

结构示意图:

datanext

 

 

特点:

这种存储方式增加删除元素较为方便,但不支持随机存取。

其基本实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct LNode{
	int data;
	struct LNode *next; 
}LNode,*LinkList;
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
	//每次均在头节点之后插入元素 
	LNode *s;//用于新节点的指针 
	int x;
	L =(LNode*)malloc(sizeof(LNode));//创建头节点 
	L->next=NULL;//初始化为空

   
	scanf("%d",&x);

	while(x != 9999){
		s=(LNode*)malloc(sizeof(LNode));//创建新节点 
		s->data=x;//将值放进数据域 
		s->next=L->next; //
		L->next=s;//将新节点插入表中,L为头指针 
		scanf("%d",&x); 
	
	} 
    
	return L;
	
} 
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
	//从表头到表尾正向建立单链表,每次均在表尾插入元素
	int x;
	L=(LNode *)malloc(sizeof(LNode)); 
	LNode *s;
	LNode *r=L;//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;
	 
} 
//按序号查找节点值
LNode *GetElem(LinkList L,int i){
	//取出带头结点单链表第i个位置的结点指针
	int j=1;
	LNode *p=L->next;//将指针指向头节点
	if(i<1)  return NULL;
	if(i==0) return L;
	while(p&&j<i){
		p=p->next;
		j++;
	}
	return p;
	 
} 
//按值查找
void LocateElem(LinkList L,int e){
	LNode *p=L->next;
	int cnt=1;//用于记录位置 
	while(p!=NULL&&p->data!=e){//当不到最后一个节点并且值没有查到时,继续查找 
	  p=p->next;
	  cnt++; 
    }
    
	if(p==NULL){
		printf("不存在该值\n");
	}else{
	    printf("该值的节点位置为:%d\n",cnt);
	}  
} 
//插入节点操作
void InsertLNode(LinkList &L,int e,int i){
	LNode *s=(LNode*)malloc(sizeof(LNode));//创建新节点 
	s->data=e; 
	LNode *p=GetElem(L,i-1);
	s->next=p->next;//先成链 
	p->next=s; // 再断链,防止后面数据丢失 
	
} 
//删除节点操作
void DeleteNode(LinkList &L,int i){
	LNode *p=GetElem(L,i-1);
	LNode *q=p->next;
	p->next=q->next;
	free(q);
} 
//求表长操作
int GetLength(LinkList L){
	int length=0;
	LNode *p=L;
	while(p->next!=NULL){
	     p=p->next;
	     length++;
    }   
	return length;     
} 
//输出表
int PrintList(LinkList L){
	LNode *p=L;
	//printf("%d->",p->data);
	while(p->next!=NULL){
		 p=p->next;
		 printf("%d->",p->data);
	}   
	printf("\n");
	return 0;
} 
int main(){
	LinkList l1;
	printf("头插法建立单链表,请输入数据,输入9999结束输入\n");
	List_HeadInsert(l1);//头插法  
	PrintList(l1);//输出表
	printf("当前表长为:%d\n",GetLength(l1));//求表长	
	InsertLNode(l1,9999,3); //插入节点操作 
	PrintList(l1);//输出表
	printf("当前表长为:%d\n",GetLength(l1));//求表长
	DeleteNode(l1,3); //删除节点 
	PrintList(l1);//输出表
	printf("当前表长为:%d\n",GetLength(l1));//求表长
	LNode *t=GetElem(l1,3);//按位置查找 
	printf("该位置结点值为%d\n",t->data);
	LocateElem (l1,2);// 按值查找 
	LocateElem (l1,10);
//	LinkList l2;
//	printf("尾插法建立单链表,请输入数据,输入9999结束输入\n");
//	List_TailInsert(l2);
//	PrintList(l2);
    return 0;
} 

运行截图:

  • 7
    点赞
  • 5
    评论
  • 39
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值