数据结构基础2_单链表的实现

#include<stdio.h>
#include<stdlib.h>
#include<sqlist1.h>
#define true 1
#define false 0
typedef int Status;
typedef struct Lnode{
	ElemType data;
	struct Lnode *next;
}Lnode,*linklist;
void Initlist(linklist &L)
{
	L=(linklist)malloc(sizeof(Lnode));
	L->next=NULL;
}
void Destorylist(linklist &L)
{
	free(L);
	L=NULL;
}
void Clearlist(linklist &L)
{
	L->next=NULL;
}
bool Listempty(linklist L)
{
	if(L->next=NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}
Status Listlength(linklist L)
{
	int n=0;
	Lnode *p=L->next;
	int i=1;
	while(p!=NULL)
	{
		n++;
		p=p->next;
	}
	return n;
}
Status Getelem(linklist L,int i,ElemType &e)
{
	Lnode *p=L->next;
	int j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
	{
		return false;
	}
	e=p->data;
}
Status Locatelem(linklist L,ElemType e,Status compare(ElemType,ElemType))
{
    Lnode *p=L->next;
	int i=0;
	while(p!=NULL)
	{
		i++;
		if(compare(e,p->data))
		{
			return i;
		}
		p=p->next;
	}
}
Status Priorelem(linklist L,ElemType e,ElemType &pre_e)
{
	int i=0;
	Lnode *p=L->next;
	while(p!=NULL)
	{
		i=Locatelem(L,e,compare_sq);
		if(i!=0&&i!=1)
		{
			Getelem(L,i-1,pre_e);
		
		return true;
	}
	p=p->next;
	}
	return false;
}
Status Nextelem(linklist L,ElemType e,ElemType &next_e)
{
	int i=0;
	Lnode *p=L->next;
	while(p!=NULL)
	{
		i=Locatelem(L,e,compare_sq);
		if(i<Listlength(L))
		{
			Getelem(L,i+1,next_e);
			return true;
		}
		p=p->next;
	}
	return false;
}
Status Listinsert(linklist &L,int i,ElemType e)
{
	Lnode *p=L;
	Lnode *s;
	int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		++j;
	}
	if(!p&&j>i-1)
	{
		return false;
	}
	s=(linklist)malloc(sizeof(Lnode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
}
Status Listdelete(linklist &L,int i,ElemType e)
{
	Lnode *p=L;
	Lnode *q;
	int j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		++j;
	}
	if(!(p->next)&&j>i-1)
	{
		return false;
	}
    q=p->next;
	p->next=q->next;
	e=q->data;
	free(q);
	return true;
}
Status visit(linklist &L)
{
	printf("%d",L->data);
}
Status Listtraverse(linklist L,Status visit(linklist &L))

{
Lnode *p;
p=L->next;
while(p!=NULL)
{
	if(visit(p)==0)
	{
		return false;
	}
	p=p->next;
}
}
void Createlist(linklist &L,int n)
{
     L=(linklist)malloc(sizeof(Lnode));
     L->next=NULL;
     Lnode *p;
     for(int i=n;i>0;--i)
     {
             p=(linklist)malloc(sizeof(Lnode));
             scanf("%d",&p->data);
             p->next=L->next;
             L->next=p;
             }
}
void mergelist(linklist &La,linklist &Lb,linklist &Lc)
{
     Lnode *pa,*pb,*pc;
     pa=La->next;
     pb=Lb->next;
     Lc=pc=La;
     while(pa&&pb)
     {
                  if(pa->data<=pb->data)
                  {
                    pc->next=pa;
                    pc=pc->next;
                    pa=pa->next;
                    }
                    else
                    {
                        pc->next=pb;
                        pc=pc->next;
                        pb=pb->next;
                        }
                        }
                        if(pa==NULL)
                      {
                         pc->next=pb;
                       }
                        else
                         {
                        pc->next=pa;
                           }
                        free(Lb);
                        }                                  



<pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<linklist1.h>
#include<stdlib.h>
int main()
{
    
linklist La;
	Initlist(La);
	Listinsert(La, 1, 1);
	Listinsert(La, 2, 2);
	Listinsert(La, 3, 5);
	Listinsert(La, 4, 7);
	Listinsert(La, 5, 10);
	Listdelete(La, 5, 10);
int len=Listlength(La);
printf("%d\n",len);
int h;
Getelem(La,2,h);
printf("%d\n",h);

	Listtraverse(La, visit);
	printf("\n");
	linklist Lb;
	Createlist(Lb,10);
	Listtraverse(Lb,visit);
	printf("\n");
	linklist Lc;
	mergelist(La,Lb,Lc);
	Listtraverse(Lc, visit);
	system("pause");
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值