数据结构-链表

链表之顺序表

顺序表的存储结构

typedef struct{
    ElemType data[MaxSize];   //定义顺序表数据
    int length;               //记录顺序表长度
}SqList;

顺序表的插入

在第i个位置插入数据e

bool ListInsert(SqList &L,int i,int e)  //插入
{
    if(i<1||i>L.length+1//i的输入不合法
        return false;
    if(L.length+1>MaxSize)           //若插入后总长度大于MaxSize,插入失败
        return false;
    for(int j=L.length;j>=i;j--)     //后移i位置后元素
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;                   //i位置元素插入e
    L.length++;                      //长度加+1
    return true;
}

顺序表的删除

bool ListDelete(SqList &L,int i,int &e)  //删除
{
    if(i<1||i>L.length)              //i的输入不合法
        return false;
    e=L.data[i-1];                 //删除该位置元素
    for(int j=i-1;j<L.length;j++)    //后续元素前移
        L.data[j]=L.data[j+1];
    L.length--;                      //长度-1
    return true;
}

顺序表的查找

int LocateElem(SqList L,int e) //查找
{
    for(int i=0;i<L.length;i++)
    {
        if(L.data[i]==e)
            return i+1;    //此处return可代替break,查找成功返回元素所在位置
    }
    return 0;              //查找失败返回0
}

顺序表的特点

顺序表特质
(1)最大特点:随机存取;
(2)插入、删除需要大量移动元素,但存储密度高;

单链表

单链表的存储结构

typedef struct LNode{
    int data;         //数据域
    struct LNode *next;    //指针域(下地址的结构应是与链表相同的指针变量),不能直接用*LinkList,因为还没遍历
}LNode,*LinkList;

头插法

LinkList headinsert(LinkList &L)
{
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
	int x;
	LNode *s; 
	scanf("%d",&x);
	while(x!=9999)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next=s;
		scanf("%d",&x);
	}
	return L;
}

尾插法

LinkList tailinsert(LinkList &L)
{
	L=(LNode*)malloc(sizeof(LNode));
	LNode *s,*r;
	int x;
	r=L;
	scanf("%d",&x);
	while(x!=9999)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;
	return L;
}

单链表常见操作

//按位查找
LinkList GetElem1(LinkList L,int i)
{
    if(i<1)
        return NULL;   //i非法返回空
    int j=1;
    LinkList p=L->next;  //p初始指向首部
    while(j<i&&p!=NULL)  //当j到达i且p不指向空时结束
    {
        p=p->next;  //每次指向下一个
        j++;
    }
    return p;
}

//按值查找
LinkList GetElem2(LinkList L,int e)
{
    LinkList p=L->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}

//插入
LinkList InsertElem(LinkList& L,int i,int e)
{
    LinkList p=GetElem1(L,i-1);
    LinkList s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return L;
}

//删除
LinkList DeleteElem(LinkList& L,int i)
{
    LinkList p=GetElem1(L,i-1);
    LinkList q=p->next;
    p->next=q->next;
    free(q);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值