(总结)数据结构之链表的基本操作说明和示例(待补充)

                                             数据结构之链表的基本操作说明和示例

一:链表的基础知识:


二:链表的分类:
   单链表,双链表和循环链表.

1.带有头结点的单链表:
   单链表的基本操作---初始化,创建,插入,删除,取某个元素值.....
   1).单链表的创建:
       a.利用头插法建立单链表:
//建立一个带头结点的单链表
void CreatList_L(LinkList &L,int n)
{

	//输入n个元素的值建立带表头结点的单链表
	int i;

	LinkList p,q;

	L = (LinkList)malloc(sizeof(LNode));
  
    //使头结点的指针域为空,即不指向任何地方.
	L->next = NULL;

	q = L;

    //头插法
	for (i=n;i>0;--i)
	{
		//生成一个新结点p
		p = (LinkList)malloc(sizeof(LNode));
   
        //读入新结点的数据
		printf("\n请输入第%d个结点的数据:",n-i+1);
		scanf("%d",&p->data);

		p->next = L->next;
		L->next = p;
	}
}
      b.利用尾插法建立单链表:
//建立一个带头结点的单链表
void CreatList_L(LinkList &L,int n)
{

	//输入n个元素的值建立带表头结点的单链表
	int i;

	LinkList p,q;

	L = (LinkList)malloc(sizeof(LNode));
  
    //使头结点的指针域为空,即不指向任何地方.
	L->next = NULL;

	q = L;

	//尾插法
	for (i=n;i>0;--i)
	{
		//生成一个新结点p
		p = (LinkList)malloc(sizeof(LNode));
		
        //读入新结点的数据
		printf("\n请输入第%d个结点的数据:",n-i+1);
		scanf("%d",&p->data);
		q->next = p;
		q = p;
	}	
	p->next = NULL;
}
     2).单链表的插入:
    难点是在指定位置之前(合法的位置是1到表长+!)插入元素时,寻找到其前一个结点.初始p为L,指向头结点,i为计数器,初始为0, 如果p=L->next;i=1;的话插入元素时就会出错(无法插入元素到第一个位置).
//指定位置插入元素的函数InsertList_L
Status InsertList_L(LinkList &L,int pos,ElemType e)
{
	//在带头结点的单链表的第pos个位置之前插入数据元素e
	int i;
	LinkList p;
	LinkList q;

	p = L;
	i = 0;

	//寻找第(pos-1)个结点
	while (p && i<pos-1)
	{
		p = p->next;
		++i;
	}

	//没有找到要插入位置的前一个结点
	if (!p || i>pos-1)
	{
		return ERROR;
	}

    //生成新结点
	q = (LinkList)malloc(sizeof(LNode));
   
	//给新结点的数据域赋值
    q->data = e;

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

	return OK;
}
    3).取得指定位置的结点元素的值:
      合法位置为1到表长,
Status GetElem(LinkList &L,int pos,ElemType &e)
{
	int j;
	LinkList p;

	//p指向首结点,j为计数器为1
	p = L->next;
	j = 1;
	//顺时针向后移动,直到p指向第pos个元素或者p为空.
	while( p && j<pos )
	{
                p = p->next;
		j++;
	}

	if( !p || j>pos)
	{
	  printf("\n取结点元素值时指定的位置不合法!\n");
	  return ERROR;		  
	}
	e = p->data;
	return OK;
}
      4).单链表的删除:
    关键是要找到待删除位置前一个结点p,然后p->next = p->next->next;解除中间元素的链接关系而删除.
//指定位置删除元素的函数DeleteList_L
Status DeleteList_L(LinkList &L,int pos,ElemType &e)
{
	//在带头结点的单链表L中,删除第pos个元素,并由e返回其值
    int i;
	LinkList p,q;

	//寻找到其前一个结点.初始p为L,指向头结点,i为计数器,初始为0,
	p = L;
	i = 0;

	//寻找第(pos-1)个结点
	while (p->next && i<pos-1)
	{
		p = p->next;
		++i;
	}

	//没有找到要删除位置的前一个结点
	if (!(p->next)|| i>pos-1)
	{
		return ERROR;
	}

	//相等于p->next = p->next->next;只是为了释放删除的结点,借助新的结点过渡
	q = p->next;
	p->next = q->next;
	
	e = q->data;

	free(q);
	q = NULL;
	return OK;
}
    5).显示所有元素的值.
//显示所有的元素值
void DisplyList_L(LinkList &L)
{
    LinkList p;
	int j;

	p = L->next;
    j = 0;

	printf("\n输出单链表的各个元素!\n");
	while(p!=NULL)
	{
		printf("\t第%d个元素是:%d\n",++j,p->data);
        p = p->next;
	}
}






   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值