单链表的基本操作(C语言)

单链表的介绍

    线性表的链式存储结构,简称链表,有单链表和双链表两类。单链表是一种基本的数据结构,有两部分组成:指针域和数据域,数据域用于存放数据,指针域用于指向下一个结点的位置。

    为了操作方便,一般为单链表创建一个头结点,指向线性表的的首元素。线性表的最后一个元素的指针域为空,表示链表的结束。

    同顺序表一样,链表也有许多基本操作,如:
(1) 单链表的创建
(2) 单链表元素的插入
(3) 单链表元素的删除
(4) 单链表元素的查找(定位)

单链表的基本操作

单链表的定义

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
	ElemType data;
	struct LNode *next;	
}LNode,*LinkList;  

单链表的初始化

void InitList(LinkList L){
	L->next=NULL;
	L->data=0;
	printf("带有头结点的单链表初始化完毕\n\n");
}

单链表的遍历

void PrintList(LinkList L){
	LNode *p;
	p=L->next;
	if(p==NULL){
		printf("单链表为空\n\n");
		return;
	}
	printf("单链表的结点值为:");
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n\n");
}

结点的头插法

Status InsertHead(LinkList L){
	//创建结点
	LNode *p;
	ElemType d;
	printf("请输入结点的值:");
	scanf("%d",&d);
	p=(LNode *)malloc(sizeof(LNode));
	p->data=d;
	
	p->next=L->next;
	L->next=p;
	
	printf("头插法插入结点成功\n\n");
	
	return OK;
	 
}

结点的尾插法

Status InsertTail(LinkList L){
	LNode *p,*q;
	ElemType d;
	
	printf("请输入结点的值:");
	scanf("%d",&d);
	
	p=L;	
	q=(LNode *)malloc(sizeof(LNode));
	q->next=NULL;
	q->data=d;
	
	while(p->next){
		p=p->next;
	}
	
	p->next=q;
	printf("尾插法创建单链表成功\n\n");
	return OK;	
}

获取某个位置的元素

Status GetElem(LinkList L,int loc){
	int i=0;
	LNode *p;
	
	p=L->next;
	
	while(p){
		i++;
		if(i==loc){
			printf("单链表的第%d个元素是:%d\n\n",loc,p->data);
			break;
		}
		p=p->next;
	}
	if(!p){
		printf("该位置超过单链表的长度\n\n");
		return ERROR;
	}
	return OK;
}

单链表结点的删除

Status DeleteNode(LinkList L,int loc){
	int i;
	LNode *p,*q;
	p=L;
	if(!p->next){
		printf("单链表为空\n\n");
		return ERROR;
	}
	if(loc<=0){
		printf("位置必须大于0\n\n");
		return ERROR; 
	}
	for(i=0;i<loc-1;i++){
		p=p->next;
		if(!p){//说明单链表结束
			printf("第%d个元素不存在\n",loc); 
			return ERROR;
		}
	}	
	
	q=p->next;	
	p->next=q->next;
		
	free(q);	
	printf("结点删除成功\n");
	return OK;
}

主函数中的相关操作

int main(void){
	LinkList L;
	L=(LNode *)malloc(sizeof(LNode));
	
	InitList(L);
	InsertHead(L);
	InsertHead(L);
	
	PrintList(L);
	
	InsertTail(L);
	InsertTail(L);
	
	PrintList(L);
	
	GetElem(L,4);
	
	DeleteNode(L,1);
	PrintList(L);
	
	DeleteNode(L,0);
	PrintList(L);
	
	return 0;
}

程序运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值