数据结构之单链表

定义单链表

typedef struct LNode{
    int data;              //数据域
    struct LNode *next;    //指针域
}LNode,*LinkList;

头插法

LinkList CreatList1(LinkList &L){
    LNode *s; //辅助指针
    int x; //存储插入结点的数据的值                            
    L=(LinkList)malloc(sizeof(LNode)); //创建头结点
    L->next=NULL; //初始为空链表
    scanf("%d",&x); //输入结点的值
    while(x!=-1){  //输入-1表示结束
        s=(LNode*)malloc(sizeof(LNode)); //创建新结点
        s->data=x; //对新结点的数据域赋值
        s->next=L->next; //新结点的后继指向第一结点
        L->next=s; //头结点的后继指向新结点
        scanf("%d",&x); //读入下一结点值
    }
    return L;
}

尾插法

LinkList CreatList2(LinkList &L){
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s, *r=L; //r为表尾指针 指向表尾
    scanf("%d",&x);  //输入结点的值
    while(x!=-1){  //输入-1表示结束
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;  //r指向新的表尾结点
        scanf("%d",&x);
    }
    r->next=NULL; //尾结点指针置空
    return L;
}

按序号查找

在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL

LNode *GetElem(LinkList L,int i){
    int j=1; //计数,初始为1
    LNode *p=L->next; //第一个结点指针赋给p
    if(i==0) return L; //若i==0,则返回头结点
    if(i<1) return NULL; //这里也可以写i<0,若i无效,则返回NULL
    while(p&&j<i){ //从第一个结点开始查找,查找第i个结点 
        p=p->next;
        j++;
    }
    return p; //返回第i个结点的指针,如果i大于表长,直接返回p
}

按值查找

从单链表第一个结点开始,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针,

若整个单链表中没有这样的结点,则返回NULL

LNode *LocataElem(LinkList L,int e){
    LNode *p=L->next;
    while(p!=NULL&&p->data!=e){ //从第一个结点开始查找data域为e的结点
        p=p->next;
    }
    return p; //找到后返回该结点指针,否则返回NULL
}

插入

插入操作是将值为i的新结点插入到单链表的第i个位置上,先检查插入位置的合法性,然后找到待插入位置的前驱结点,即第i-1个结点,再在其后插入新结点。

算法思路:

1、取指向插入位置的前驱结点的指针           ①p=GetElem(L,i-1);

2、令新结点*s的指针域指向*p的后继节点    ②s->next=p->next;

3、令结点*p的指针域指向新插入的结点*s    ③p->next=s;

 

删除:

删除操作是将单链表的第i个结点删除。先检查删除位置的合法性,然后查找表中第i-1个结点,即被删结点的前驱结点,再将其删除

算法思路:

1、取指向删除位置的前驱结点的指针               ①p=GetElem(L,i-1);

2、取指向删除位置的指针                                 ②q=p->next;

3、p指向结点的后继指向被删除结点的后继      ③p->next=q->next;

4、释放删除结点                                                ④free(q);

 

两个有序链表序列的合并(完整c++代码)

#include<bits/stdc++.h>
using namespace std;

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

LinkList CreatList(){ 
	LinkList L,s,r;
	L=(LNode*)malloc(sizeof(LNode));
	r=L;
	int x;
	scanf("%d",&x);
	while(x!=-1){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
	    r->next=s;
		r=s;
		scanf("%d",&x); 
	}
	r->next=NULL;
	return L;
}
void Merge(LinkList A,LinkList B,LinkList &C)
{
    LinkList p=A->next;
    LinkList q=B->next;
    LinkList r;
    r=C=A;
    while(p!=NULL&&q!=NULL)
    {
        if(p->data<=q->data)
        {
            r->next=p;
            r=p;
            p=p->next;
        }
        else{
            r->next=q;
            r=q;
            q=q->next; 
        }
    }
	r->next=p?p:q;
	free(B);
}

void Print(LinkList C){
	LinkList p=C->next;
	if(!p){
		printf("NULL");
	}else{
		printf("%d",p->data);
		p=p->next;
	}
	while(p){
		printf(" %d",p->data);
		p=p->next;
	}
}
int main(){
	LinkList A,B,C;
	A=CreatList();
	B=CreatList();
	Merge(A,B,C);
	Print(C);
	return 0;
}

 运行结果

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值