数据结构学习——线性表的链式存储(单链表)

若线性表为空表,则头结点的指针域为空

p是指向线性表第i个元素的指针,p->data的值是一个数据元素,

单链表的读取 

/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{
	int j;
	LinkList p;		/* 声明一结点p */
	p = L->next;		/* 让p指向链表L的第一个结点 */
	j = 1;		/*  j为计数器 */
	while (p && j<i)  /* p不为空或者计数器j还没有等于i时,循环继续 */
	{   
		p = p->next;  /* 让p指向下一个结点 */
		++j;
	}
	if ( !p || j>i ) 
		return ERROR;  /*  第i个元素不存在 */
	*e = p->data;   /*  取第i个元素的数据 */
	return OK;
}

思路:声明头节点,定义指针指向头节点,将计数器定为1,当链表不为空且i<j时,继续循环

注:要考虑该节点不存在的情况

单链表的插入

将s插入到p和p->next之间

核心代码如下:

//插入s
s->next=p->next;
p->next=s;

两句话的顺序不可调整

Status ListInsert(LinkList *L,int i,ElemType e)
{ 
	int j;
	LinkList p,s;
	p = *L;   
	j = 1;
	while (p && j < i)     /* 寻找第i个结点 */
	{
		p = p->next;
		++j;
	} 
	if (!p || j > i) 
		return ERROR;   /* 第i个元素不存在 */
	s = (LinkList)malloc(sizeof(Node));  /*  生成新结点(C语言标准函数) */
	s->data = e;  
	s->next = p->next;      /* 将p的后继结点赋值给s的后继  */
	p->next = s;          /* 将s赋值给p的后继 */
	return OK;
}

思路:声明头节点,初始化j=1,j<i,指针向后移动,若到链表末尾,指针为空,返回ERROR,找到,系统生成空节点,核心代码,OK

单链表的删除

核心代码

q = p->next;
p->next = q->next

代码如下:

Status ListDelete(LinkList *L,int i,ElemType *e) 
{ 
	int j;
	LinkList p,q;
	p = *L;
	j = 1;
	while (p->next && j < i)	/* 遍历寻找第i个元素 */
	{
        p = p->next;
        ++j;
	}
	if (!(p->next) || j > i) 
	    return ERROR;           /* 第i个元素不存在 */
	q = p->next;
	p->next = q->next;			/* 将q的后继赋值给p的后继 */
	*e = q->data;               /* 将q结点中的数据给e */
	free(q);                    /* 让系统回收此结点,释放内存 */
	return OK;
}

思路:声明指针指向头节点,j<i时,往后遍历,若到链表末为空,则不存在,找到-核心代码,将q节点的数据赋值给e,返回,释放q节点

单链表的创建

对于链表来说,所占用的空间大小和位置是不需要预先分配的,所以创建单链表的过程就是一个动态生成链表的过程

 1)头插法:
void CreatFromHead(LinkList L, int n)
{
    int i;
    LNode *s;
    for (i = 0; i < n; i++)
    {
        s = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &s->data);
        s->next = L->next;
        L->next = s;
    }
}
 2)  尾插法:

核心代码:

r->next = s;
r = s;
void CreatFromTail(LinkList L, int n)
{
    int i;
    LNode *r, *s;
    r = L;
    for (i = 0; i < n; i++)
    {
        s = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &s->data);
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

单链表的整表删除

Status ClearList(LinkList *L)
{ 
	LinkList p,q;
	p=(*L)->next;           /*  p指向第一个结点 */
	while(p)                /*  没到表尾 */
	{
		q=p->next;
		free(p);
		p=q;
	}
	(*L)->next=NULL;        /* 头结点指针域为空 */
	return OK;
}

除以上内容外,链表还有静态链表、循环链表和双向链表,在后续的博客中会慢慢更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值