数据结构------单链表的实现

/*****************************************************
	** 文件名: Single Linked List.cpp
	** Copyright (c) 2019 Asuka Shin
	** 创建人: 周志豪
	** 日 期:  2019.03.29
	** 修改人: 周志豪
	** 日 期:  2019.04.04
	** 描 述:  单链表的实现
	** 版 本:  3.0
*****************************************************/

#include <iostream>
#include <stdlib.h>
using namespace std;


const int TRUE = 1;
const int ERROR = 0;
const int OVERFLOW = -2;
const int OK = 1;
const int FALSE = 0;

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

/*逆序位输入n个元素的值,建立带头结点的单链线性表L*/
void CreateList_L(LinkList &L,int n);

/*通过位序查找元素*/
/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
Status GetElem_L(LinkList L, int i, ElemType &e);

/*在单链表L中的第i个元素前插入元素e*/
Status ListInsert_L(LinkList &L, int i, ElemType e);

/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
Status ListDelete_L(LinkList &L, int i, ElemType &e);



/*逆序位输入n个元素的值,建立带头结点的单链线性表L*/
void CreateList_L(LinkList &L,int n)
{
    LinkList p;
    L = new LNode;
    L -> next = NULL;//建立一个带头结点的单链表
    for(int i = n; i > 0; --i)
    {
        p = new LNode;//生成新结点
        cout << "请输入你逆序输入你要创建的链表元素" << endl;
        cin >> p -> data;//向结点的数据域输入元素
        p -> next = L -> next;//插入到表头
    }

}

/*通过位序查找元素*/
/*L为带头节点的单链表的头指针,当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR*/
Status GetElem_L(LinkList L, int i, ElemType &e)
{
   LinkList p;
   int j = 1;
   p = L -> next;//指针p指向了头结点后面的那个结点,因为头结点的数据域里没数据,所以可以跳过去
   while(p && j < i)
   {
       /*首先,指针p得指向结点,不能指不到结点,其次计数器j得小于位序i,等于i的时候直接跳出循环*/
       p = p -> next;//指针p不断后移
       ++j;//计数器也开始计数
   }
   if(!p || j > i)
      return ERROR;//如果p指针没有指向结点,或者计数器坏了,记不了数 return ERROR
    e = p -> data;//把p指向那个结点数据域的值给e
    return OK;
}

/*在单链表L中的第i个元素前插入元素e*/
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
     LinkList p,s;//P是指针,s是结点
     int j = 0;
     p = L;
     while(p && j < i - 1)
     {
         p = p -> next;
         ++j;
     }
     if(!p || j > i - 1)
        return ERROR;

      s = new LNode;//新建一个要插入链表的结点S
      s -> data = e; //结点S的数据域为e
      s ->next = p -> next;
      p -> next = s;
      return OK;
}

/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
    LinkList p,q;
    int j;
    p = L;
    j = 0;

    while(p -> next && j < i - 1)
    {
        p =  p -> data;
        ++j;
    }
    if(!(p -> next) || j > i - 1)
        return ERROR;
    q = p -> next;
    p -> next = q -> next;
    e = q -> data;
    free(q);
    return OK;
}
/*已知单链线性表La和Lb的元素按值非递减序列排列*/
/*归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列*/
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
{
    pa = La -> next;//指针pa指向单链线性表La的第一个元素(第0个元素为头结点)
    pb = Lb -> next;//指针pb指向单链线性表Lb的第一个元素(第0个元素为头结点)
    Lc = pc = La;//单链线性表L c的头结点为La的头结点,且由pc指向
    while(pa && pb)
    {
        if(pa -> data <= pb -> data) //如果p中的数据域小于pb中的数据域
             pc -> next = pa;//将pa指向的结点放在单链表Lc的后面
             pc = pa;//指针pc由Lc的头结点后移
             pa = pa -> next;//指针pa也后移

        else
        {
            pc -> next = pb;
            pc = pb;
            pb = pb -> next;
        }
    }
        pc -> next = pa?pa:pb//将循环中已经用完的链的另一个链的元素插入剩余段
        free(Lb)//释放Lb的头结点。 La的头结点变成了Lc的头结点


}

int main()
{
    /*测试过程省略*/
    return 0;
}

猜你喜欢

转载自blog.csdn.net/AsukaShin/article/details/89032942
今日推荐