线性表的链式存储

线性表的链式存储

头文件如下

//LinkList.h


#ifndef LINKLIST_H
#define LINKLIST_H

#define OK 1
#define ERROR 0;
typedef int Status;
typedef int ElemType;

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

Status GetElem(LinkList L, int i, ElemType &e);
Status ListInsert(LinkList &L, int i, ElemType e);
Status ListDelete(LinkList &L, int i, ElemType &e);
void CreateList(LinkList &L, int n);
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);
void ListTraverse(LinkList &L);

#endif

链表操作的实现

  1 //LinkList.cpp
  2 
  3 #include"LinkList.h"
  4 #include<iostream>
  5 #include<cstdlib>
  6 
  7 Status GetElem(LinkList L, int i, ElemType &e)
  8 {
  9     LinkList p;
 10     p = L->next;
 11     int j = 1;
 12     while (p&&(j < i)) {
 13         p = p->next;
 14         ++j;
 15     }
 16     if (!p || j > i)
 17         return ERROR;
 18     e = p->data;
 19     return OK;
 20 }
 21 
 22 //当需要改变LinkList的值的时候,需要&引用
 23 Status ListInsert(LinkList &L, int i, ElemType e)
 24 //在带头结点的单链表中第i个位置之前插入元素e
 25 {
 26     LinkList p;
 27     p = L;
 28     int j = 0;
 29     while (p&&j < i - 1)
 30     {
 31         p = p->next;
 32         ++j;
 33     }
 34     if (!p || j > i - 1)
 35         return ERROR;
 36     LinkList s = (LinkList)malloc(sizeof(LNode));
 37     s->data = e;
 38     s->next = p->next;
 39     p->next = s;
 40     return OK;
 41 }
 42 
 43 Status ListDelete(LinkList &L, int i, ElemType &e)
 44 //在带头节点的单链表L中,删除第i个元素,并由e返回其值
 45 {
 46     LinkList p = L;
 47     int j = 0;
 48     while (p->next&&j < i - 1) {//寻找第i个节点,并令p指向其前趋
 49         p = p->next;
 50         ++j;
 51     }
 52     if (!(p->next) || j > i - 1)
 53         return ERROR;
 54     LinkList q = p->next;     //删除并释放结点
 55     p->next = q->next;
 56     e = q->data;
 57     free(q);
 58     return OK;
 59 }
 60 
 61 void CreateList(LinkList &L, int n)
 62 //逆序输入n个元素的值,建立带表头结点的单链线性表L.
 63 {
 64     L = (LinkList)malloc(sizeof(LNode));
 65     L->next = NULL;    //建立一个带表头结点的单链表
 66     if(n>0)
 67         std::cout << "逆序输入链表元素值: " << std::endl;
 68     for (int i = n; i > 0; --i)
 69     {
 70         LinkList p = (LinkList)malloc(sizeof(LNode));//生成新结点
 71         std::cin >> p->data;
 72         p->next = L->next;
 73         L->next = p;//插入到表头
 74     }
 75 }
 76 
 77 void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc)
 78 //要求单链线性表La和Lb的元素按非递减排列
 79 //归并La和Lb得到新的的单链线性表Lc,Lc的元素也按值
 80 {
 81     LinkList pa = La->next;
 82     LinkList pb = Lb->next;
 83     LinkList pc = Lc=La;        //将La的头结点作为Lc的头结点
 84     while (pa&&pb)
 85     {
 86         if (pa->data <= pb->data)
 87         {
 88             pc->next = pa;
 89             pc = pa;
 90             pa = pa->next;
 91         }
 92         else
 93         {
 94             pc->next = pb;
 95             pc = pb;
 96             pb = pb->next;
 97         }
 98     }
 99     pc->next = pa ? pa : pb;
100     free(Lb);
101 }
102 
103 void ListTraverse(LinkList &L)
104 {
105     LinkList q = L;
106     q = q->next;
107     while (q)
108     {
109         std::cout << q->data<<"  ";
110         q = q->next;
111     }
112     std::cout << std::endl;
113 }

主函数实现

//Main.cpp

#include"LinkList.h"
#include<iostream>
using namespace std;

int main()
{
    LinkList La;
    LinkList Lb;
    LinkList Lc;

    CreateList(La, 4);
//    CreateList(Lb, 3);

//    ListTraverse(La);
//    ListTraverse(Lb);

//    MergeList(La, Lb, Lc);

//    cout << "Lc: ";
//    ListTraverse(Lc);

    LinkList L;
    ElemType n1 = 1;
    ElemType n2 = 2;
    ElemType n3 = 3;
    ElemType n4 = 4;
    ElemType n5 = 5;
    ElemType n6 = 6;
    ElemType n7 = 7;
    ElemType n8 = 8;
    ElemType n9 = 9;
    ElemType n0 = 0;
    ElemType temp = 0;

    ListInsert(La, 2, n9);
    ListTraverse(La);

    CreateList(L, 0);
    ListInsert(L, 1, n7);
    ListInsert(L, 2, n9);
    ListTraverse(L);


    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/sgawscd/p/10176058.html