数据结构-c语言代码实现-单链表的基本操作-带头节点

目录​​​​​​​

目录

单链表-动态分配链式存储结构

基本操作

1.单链表—初始化

2.创建单链表

3.单链表-求表长

4.单链表-按位插入

5.单链表-按位删除

6.单链表-查找-按值查找位

7.单链表-判空

8.单链表-销毁

9.单链表-打印

代码实现结果

单链表-动态分配链式存储结构

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ElemType char

typedef struct Snode{
	ElemType data;//数据域
	struct Snode *next;//指针域
}Snode,*ListSLink;//结点=数据域+指针域 

基本操作

1.单链表—初始化

void ListSLink_Init(ListSLink &L){
	L=(ListSLink)malloc(sizeof(Snode));//生成头结点
	L->next=NULL;
	printf("初始化成功\n");
}

2.创建单链表

void ListSLink_Creat(ListSLink &L)
{
    ElemType data;
    Snode *p=L;//创建指针指向头节点 方便后续遍历
    printf("输入数据:\n");
    scanf("%c",&data);
    getchar();
    while(data!='#'){
        Snode *s=(Snode *)malloc(sizeof(Snode));//新建节点插入
        s->next=p->next;
        p->next=s;
        s->data=data;
        p=p->next;
        printf("输入数据:\n");
        scanf("%c",&data);
        getchar();
    }
}

3.单链表-求表长

int ListSLink_Length(ListSLink L){
	int i=0;//计数器
	Snode *p=L;//p指向头节点
	while(p->next!=NULL){//若p的下一个节点不为空 则p指向p的下一个节点(遍历) 计数器++
		i++;
		p=p->next ;
	}
	return i;//返回计数值
}

4.单链表-按位插入

void ListSLink_Insert(ListSLink &L,int pos,ElemType newval){
	int len=ListSLink_Length(L);//求表长
	if(pos-1>len||pos<1){//若插入位置不合法,则程序异常退出
		printf("链表插入失败\n");
		exit(-1);
	}
	else{
		Snode *p=L;//创建指针指向头节点 方便后续遍历
		while(--pos){//指针指向要插入位置
			p=p->next;
		}
		Snode *s=(Snode *)malloc(sizeof(Snode));//新建节点插入
		s->data =newval;//为新节点数据赋值
		s->next=p->next ;//插入链表中
		p->next =s;
		printf("链表插入成功\n");
	}
}

5.单链表-按位删除

void ListSLink_Delete(ListSLink &L,int pos){
	int len=ListSLink_Length(L);
	if(pos-1>=len||pos<1){//若删除位不合法或表为空,程序异常退出 
		printf("链表删除失败\n");
		exit(-1);
	}
	else{
		Snode *p=L;//创建指针指向头节点 方便后续遍历
		while(--pos){//指针指向要删除的位置
			p=p->next;
		}
		Snode *s=p->next;
		p->next=s->next;
		free(s); //删除并释放节点
		printf("链表删除成功\n");
	}
}

6.单链表-查找-按值查找位

int ListSLink_Seek(ListSLink L,ElemType val){
    int len=ListSLink_Length(L);//表长
    int i=0;
    Snode *p=L;//创建指针指向头节点 方便后续遍历
    while(i!=len){//遍历整个单链表查找元素
        if(p->next->data==val){//若查找成功 返回位号
            printf("按值查找成功\n");
            return i+1;
        }
        else{
        	p=p->next;
            i++;
        }
    } //若遍历完整个链表未查找到值 则返回-1
    printf("按值查找失败\n");
    return -1;
}

7.单链表-判空

void ListSLink_Isvoid(ListSLink L){
	if(L->next!=NULL){
		printf("链表不为空\n");
	}
	else{
		printf("链表为空\n");
	}
}

8.单链表-销毁

void ListSLink_Destory(ListSLink &L){
    Snode *p=L;//创建指针指向头节点 方便后续遍历
    while(p->next!=NULL){//若下一个节点不为空 指针后移到下个节点 释放(删除)此节点
        Snode *s=p;
        p=p->next ;
        free(s);
    }
    L->next=NULL;
    printf("链表销毁成功\n");
}

9.单链表-打印

void ListSLink_Print(ListSLink L){
	Snode *p=L;//创建指针指向头节点 方便后续遍历
	while(p->next!=NULL){//若下一个节点不为空 则指针后移到下个节点 并打印数据
		p=p->next;
		printf("%c ",p->data);
	}
}

代码实现结果

int main()
{
    ListSLink L;
    ListSLink_Init(L);//初始化单链表
    ListSLink_Creat(L);//创建单链表
    ListSLink_Insert(L,1,'A');//插入数据
    ListSLink_Print(L);//打印单链表
	printf("1在表中第%d位\n",ListSLink_Seek(L,'1'));
    ListSLink_Delete(L,1);//按位删除
    printf("单链表长度为:%d\n",ListSLink_Length(L));
    ListSLink_Print(L);//打印单链表 
    ListSLink_Isvoid(L);//判空 
    ListSLink_Destory(L);//销毁单链表 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值