数据结构恋恋不忘之【单链表】

单链表

【单链表】定义

//单链表定义
typedef struct LNode //单链表节点结构体
{
    int data; //数据域
    struct LNode *next; //指针域 指向下一个节点
}LNode, *LinkList;//单链表定义

【单链表带头节点】头插法建表

//【单链表带头节点】头插法建表
LinkList list_head_insert(LinkList& L)
{
    LNode* s;//新插入的节点
    int x;//新插入的节点对应的数据
    L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
    L->next = NULL;//L->data 里边没放东西
    
    scanf("%d", &x);//从标准输入读取数据//3 4 5 6 7 9999
    while (x != 9999)
    {
        s = (LNode*)malloc(sizeof(LNode));//申请一个新空间给 s,强制类型转换
        s->data = x;//把读取到的值,给新空间中的 data 成员
        s->next = L->next;//让新结点的 next 指针指向链表的第一个元素(第一个放我们数据的元素)
        L->next = s;//让 s 作为第一个元素
        scanf("%d", &x);//读取标准输入
    }
    
    return L;
}//【单链表带头节点】头插法建表

【单链表带头节点】尾插法建表

//【单链表带头节点】尾插法建表
LinkList list_tail_insert(LinkList &L)
{
	int x;//新插入的节点对应的数据
	L=(LinkList)malloc(sizeof(LNode));//带头节点的链表
	LNode *s, *r = L;

	scanf("%d",&x);
	while(x!=9999)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;//让尾部结点指向新结点
		r=s;//r指向新的表尾结点
		scanf("%d",&x);
	}
	r->next=NULL; //尾结点的 next 指针赋值为 NULL
	
	return L;
}//【单链表带头节点】尾插法建表

【单链表带头节点】按位序查找

//【单链表带头节点】按位序查找
//按序号查找结点值,NULL 代表查找的结点不存在
LNode *GetElem(LinkList L,int i)
{
    int j=1;
    LNode *p=L->next;
    
    if(i==0) return L;
    if(i<1) return NULL;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    
    return p;
}//【单链表带头节点】按位序查找

【单链表带头节点】按值查找

//【单链表带头节点】按值查找
//若没有对应值,则返回NULL
LNode *LocateElem(LinkList L,ElemType e)
{
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e)
    {
    	p=p->next;
    }
        
    return p;
}//【单链表带头节点】按值查找

【单链表带头节点】在指定位序插入新节点

//【单链表带头节点】在指定位序插入新节点
bool ListFrontInsert(LinkList L,int i,ElemType e)
{
	LinkList p=GetElem(L,i-1);
	if(NULL==p)
	{
		return false;
	}
	LinkList s=(LNode*)malloc(sizeof(LNode));//为新插入的结点申请空间
	s->data=e;
	s->next=p->next;
	p->next=s;
	
	return true;
}//【单链表带头节点】在指定位序插入新节点

【单链表带头节点】删除指定位序的节点

//【单链表带头节点】删除指定位序的节点
bool ListDelete(LinkList L,int i)
{
	LinkList p=GetElem(L,i-1);
    if(NULL==p)
    {
    	return false;
    }
    LinkList q;//用来存储要删除的结点地址
    q=p->next;
    p->next=q->next;//断链
    free(q);//释放对应结点的空间
    
    return true;
}

【单链表带头节点】依次打印节点值

//【单链表】依次打印节点值
void print_list(LinkList L)
{
    L = L->next;
    while (L != NULL)//NULL 是为了代表一张空的藏宝图
    {
        printf("%3d", L->data);//打印当前结点数据
        L = L->next;//指向下一个结点
    }
    printf("\n");
}//【单链表】依次打印节点值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

只会HelloWorld的华娃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值