• 线性表的链式存储


    线性表的链式存储

    头文件如下

    //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;
    }
  • 相关阅读:
    个人编写的一个简单的DB类
    Access绝对地址
    sentry cli 上传source map
    自动旋转的饼图(echarts)
    点会转的折线图还带着柱子
    node 自动化工程部署
    SQL 模糊查询
    编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
    configure、make、make install 解释
    Linux学习笔记(实时更新)
  • 原文地址:https://www.cnblogs.com/sgawscd/p/10176058.html
Copyright © 2020-2023  润新知