• 【数据结构】单链表的相关笔记


      1 #include "stdio.h"
      2 #include "malloc.h"
      3 #define OK 1
      4 #define ERROR 0
      5 
      6 typedef int Status;
      7 typedef int ElemType;
      8 
      9 typedef struct LNode
     10 {
     11     ElemType data;
     12     struct LNode* next;
     13 }LNode, * LinkList;  //结点类型LNode,链表类型的定义LinkList
     14 
     15 void CreateList(LinkList& L, int n);//初始化单链表
     16 int LocateElem(LinkList L, ElemType e);//返回表中第一个与e相等的元素位序。若不存在,返回0
     17 Status GetElem(LinkList L, int i, ElemType& e);//获取ai元素的值返回在e中。如果i不合法,返回ERROR,否则为e赋值,返回OK
     18 void ListPrint(LinkList L);//打印链表
     19 Status ListDelete(LinkList& L, int i, ElemType& e);//实现在 链表L上删除ai元素,并将该元素在e中返回。需要判断输入i的合法性。
     20 Status ListInsert(LinkList& L, int i, ElemType e);//实现在链表中ai元素之前插入元素e,需要判断输入i的合法性。
     21 Status Intersection(LinkList La, LinkList Lb, LinkList& Lc); //实现La和Lb的交集Lc
     22 Status Difference(LinkList La, LinkList Lb, LinkList& Lc); //实现La和Lb的差集Lc
     23 Status PTR_AI(LinkList& Lc, ElemType i, ElemType s);
     24 Status ListOrderInsert(LinkList& L, ElemType e);
     25 void  Reverse(LinkList La, LinkList& Lb);
     26 int main()
     27 {
     28     LinkList La, Lb;
     29     int n;
     30 
     31     scanf("%d", &n);
     32     CreateList(La, n);//构造有n个元素的表
     33     Reverse(La, Lb);
     34     ListPrint(Lb);
     35     return 0;
     36 }
     37 /* 请在这里填写答案 */
     38 void ListPrint(LinkList L)//打印整张表 
     39 {
     40     LinkList p;
     41     p = L->next;
     42     if (p == NULL)    //空表,输出NULL
     43     {
     44         printf("NULL");
     45         return;
     46     }
     47     while (p != NULL) //表非空,依次输入各个元素的值,用空格隔开。注意最后一个元素后面没有空格
     48     {
     49         if (p == L->next)
     50         {
     51             printf("%d", p->data);
     52         }
     53         else printf(" %d", p->data);
     54         p = p->next;
     55     }
     56 }
     57 void CreateList(LinkList& L, int n) {
     58     LinkList q, p;
     59     L = (LinkList)malloc(sizeof(LNode));
     60     L->next = NULL;
     61     q = L;
     62     for (int i = 1; i <= n; i++)
     63     {
     64         p = (LinkList)malloc(sizeof(LNode));
     65         scanf("%d", &p->data);
     66         q->next = p;
     67         q = q->next;
     68     }
     69 }  //初始化单链表
     70 Status GetElem(LinkList L, int i, ElemType& e) {
     71     LinkList p;
     72     p = L->next; int j = 1;
     73     while (p && j < i)
     74     {
     75         p = p->next;
     76         j++;
     77     };
     78     if (!p)
     79     {
     80         return ERROR;
     81     }
     82     e = p->data;
     83     return OK;
     84 
     85 
     86 }
     87 int LocateElem(LinkList L, ElemType e) {
     88     LinkList p;
     89     p = L->next;
     90     int j = 1;
     91     while (p)
     92     {
     93         if (p->data == e)
     94         {
     95             return j;
     96         }
     97         p = p->next;
     98         j++;
     99     };
    100     return ERROR;
    101 
    102 }
    103 Status ListDelete(LinkList& L, int i, ElemType& e)//实现在 链表L上删除ai元素,并将该元素在e中返回。需要判断输入i的合法性。
    104 {
    105     LinkList p, s;
    106     p = L; int j = 0;
    107     while (p && j < i - 1)
    108     {
    109         p = p->next;
    110         j++;
    111     };
    112     if (!p) return ERROR;
    113 
    114     s = p->next;
    115     e = s->data;
    116 
    117     p->next = s->next;
    118     free(s);
    119     return OK;
    120 }
    121 Status ListInsert(LinkList& L, int i, ElemType e)//实现在链表中ai元素之前插入元素e,需要判断输入i的合法性。
    122 {
    123     LinkList s, p;
    124     int j;
    125     p = L; j = 0;
    126     while (p && j < i - 1)
    127     {
    128         p = p->next;
    129         ++j;
    130     }
    131     if (!p) return ERROR;
    132 
    133     s = (LinkList)malloc(sizeof(LNode));
    134     if (!s) return ERROR;
    135     s->data = e;
    136 
    137     s->next = p->next;
    138     p->next = s;
    139 
    140     return OK;
    141 }
    142 Status Intersection(LinkList La, LinkList Lb, LinkList& Lc)
    143 {
    144     LNode* q1, * q2, * q3, * p;
    145     q3 = Lc;
    146     q1 = La->next;
    147     while (q1 != NULL)
    148     {
    149         q2 = Lb->next;
    150         while (q2 && q1->data != q2->data)
    151         {
    152             q2 = q2->next;
    153         }
    154         if (q2 != NULL)
    155         {
    156             p = (LNode*)malloc(sizeof(LNode));
    157             p->data = q1->data;
    158             q3->next = p;
    159             q3 = q3->next;
    160         }
    161         q1 = q1->next;
    162     }
    163     q3->next = NULL;
    164     return OK;
    165 }
    166 Status Difference(LinkList La, LinkList Lb, LinkList& Lc)
    167 {
    168     LinkList p1, p2, p3, q;
    169     p3 = (LinkList)malloc(sizeof(LNode));
    170     p1 = La->next;
    171     p3 = Lc;
    172     while (p1)
    173     {
    174         p2 = Lb->next;
    175         while (p2 && p1->data != p2->data)
    176         {
    177             p2 = p2->next;
    178         }
    179         if (p2 == NULL)
    180         {
    181             q = (LinkList)malloc(sizeof(LNode));
    182             q->data = p1->data;
    183             p3->next = q;
    184             p3 = p3->next;
    185         }
    186         p1 = p1->next;
    187     }
    188     p3->next = NULL;
    189     return OK;
    190 }
    191 Status PTR_AI(LinkList& La, ElemType i, ElemType s)//i=位序    s=输入的数值
    192 {
    193     LinkList p,e;
    194     int temp;
    195     p = La->next; int j = 1;
    196     while (j<i)
    197     {
    198         p = p->next;
    199         j++;
    200     }//遍历到ai而不是ai-1
    201     e = (LinkList)malloc(sizeof(LNode));
    202     e->data = s;
    203 
    204     e->next = p->next;
    205     p->next = e;//在ai后面开辟新节点
    206     
    207     temp= p->data;
    208     p->data = e->data;
    209     e->data = temp;//两数交换
    210 
    211     return 0;
    212 }//211806141
    213 Status ListOrderInsert(LinkList& L, ElemType e) {
    214     LinkList p,q;
    215     int temp;
    216     p = L;
    217     if (!p) return ERROR;
    218 
    219     q = (LinkList)malloc(sizeof(LNode));
    220     q->data = e;
    221 
    222     while (p->next != NULL )
    223     {
    224         if (p->data <= e && p->next->data >= e )
    225         {
    226             q->next = p->next;
    227             p->next = q;
    228             return OK;
    229         }
    230         p = p->next;
    231     }
    232     q->next = p->next;
    233     p->next = q;
    234     return OK;
    235 }
    236 void  Reverse(LinkList La, LinkList& Lb) {
    237     LinkList q, p;
    238     q = La;
    239 
    240     Lb = (LinkList)malloc(sizeof(LNode));
    241     Lb->next = NULL;
    242 
    243 
    244     while (q)
    245     {
    246         p = (LinkList)malloc(sizeof(LNode));
    247 
    248         p->data = q->data;
    249         
    250         p->next = Lb->next;
    251         Lb->next = p;
    252 
    253         q = q->next;
    254     }
    255     
    256 
    257 
    258 
    259 }
  • 相关阅读:
    C++ Low level performance optimize
    简单find命令的实现
    数据结构学习之栈
    随机数的生成
    数据结构学习(一)
    C复习---动态内存分配
    (转)虚拟文件系统(VFS)浅析
    (转) 中断处理程序&中断服务例程
    Gradle系列教程之依赖管理
    Gradle系列教程之依赖管理
  • 原文地址:https://www.cnblogs.com/Zoeun/p/12511455.html
Copyright © 2020-2023  润新知