数据结构 单链表的初始化、、查找、插入元素、删除元素操作

#include <iostream>
#include <cstdlib>
#include <math.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define Status int
using namespace std;
//定义单链表的存储结构
typedef struct LNode
{
    int data;//数据域
    LNode *next;//指针域
}LNode,*LinkList;  //LnkList为指向LNode类型的指针
//将单链表初始化
/*Status InitList(LNode &L)
{
    L=new LNode;
    L->next=NULL;
    return OK;
}*/
//查找元素在单链表中的位置
LNode* LocateElem(LNode L,int e)
{
    p=L->next; //初始化一个指向LNode类型的指针,初始值为链表的首元结点
    while(p)
    {
        if(p->data==e)
            return p;//如果这个节点的数据域和要查找的数据相等,就返回该指针
        else
            p=p->next; //如果这个节点的数据域和要查找的数据不相等,就将指针后移
    }
    return ERROR; //如果遍历链表后都没有找到,就返回ERROR
}
//将元素插入到单链表的第i个位置
Ststus ListInsert(LNode &L,int i,int e)
{
    p=L;//初始化一个指向LNode类型的指针
    int j=0;
    while(p && j<i-1)
    {//找到第i-1个节点的位置
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
        return ERROR; //如果跳出循环时p为空或者j>i-1,则出现错误
    LNode s=new LNode; //生成一个新节点
    s->data=e;  //新节点的数据域为要插入的元素
    s->next=p->next; //新节点的指针域为原来的第i个节点
    p->next=s;//p的指针域为插入的新节点
    return OK;
}
//将单链表第i个位置的元素删除
Satus ListDelete(LNode &L,int i)
{
    p=L;//初始化一个指向LNode类型的指针
    int j=0;
    while((p->next) && j<i-1)
    {//找到第i-1个节点的位置
        p=p->next;
        j++;
    }
    if(!(p->next) || j>i-1)
        return ERROR;//如果跳出循环时p的下一个元素为空或者j>i-1,则出现错误
    s=new LNode;
    s=p->next;//用一个临时节点s存储要删除的节点
    p->next=p->next->next;//改变p的指向
    delete s;//删除这个节点
    return OK;
}
//采用单链表结构编程实现两个有序单链表的归并运算。
Status mergeList(LNode &La,LNode &Lb,LNode &Lc)
{
    LinkList pa, pb, pc, q, p;
	pa = La->next; //pa和pb分别指向两链表的首元结点
	pb = Lb->next;
	Lc = pc = La;//初始时让Lc的头指针指向La所指的链表La的头结点
	pc->next = NULL;
	while(pa && pb)
    {//当pa和pb的指向都不为空时
        if(pa->data==pb->data)
        {//如果两元素相等
            pc->data=pa->data;//将La当前节点的值赋给Lc当前节点
            pc=pa;
            pa=pa->next;
            pb=pb->next;//pa和pb也向后移动
        }
        else if(pa->data < pb->data)
        {//如果链表La当前节点的数据较小
            pc->data=pa->data;//将La当前节点的值赋给Lc当前节点
            pc=pa;
            pa=pa->next;//pa向后移动
        }
        else if(pa->data > pb->data)
        {
            pc->data=pb->data;//将Lb当前节点的值赋给Lc当前节点
            pc=pb;//指针pc后移
            pb=pb->next;//pb向后移动
        }
    }
    pc->next=pa?pa:pb;//跳出循环时如果pc->next=pa则说明La非空,就将La剩下的部分链接在Lc后,
    //如果跳出循环时pc->next!=pa就说明Lb非空或者二者都为空,就将Lb剩下的部分链接在Lc后
    return OK;
}
发布了11 篇原创文章 · 获赞 0 · 访问量 314

猜你喜欢

转载自blog.csdn.net/qiankendeNMY/article/details/105404223
今日推荐