zoukankan      html  css  js  c++  java
  • 王道数据结构——线性表中链表的实现与应用

    1、单链表

      1 #include <cstdio>
      2 #include <cstdlib> 
      3 typedef struct LNode{
      4     int data;
      5     struct LNode *next;
      6 }LNode, *LinkList;//定义结构体和结构体指针 
      7 
      8 /*按值查找结点*/
      9 int LocateElem(LinkList &L, int x){
     10     LNode *p = L -> next;
     11     int cnt = 1;
     12     while(p){
     13         if(p -> data == x)
     14             break;
     15         cnt++;
     16         p = p -> next;
     17     }
     18     return cnt;
     19 } 
     20 /*按序号查找结点值,序号从0开始*/
     21 LNode *GetElem(LinkList &L, int i){
     22     LNode *p = L -> next;
     23     if(i == 0) return L;
     24     if(i < 1)  return NULL;
     25     
     26     int cnt = 1;
     27     while(p != NULL){
     28         if(cnt == i)
     29             break;
     30         cnt++;//千万要记得不等时,计数要增加1啊 
     31         p = p->next;
     32     } 
     33     return p;
     34 } 
     35 /*尾插法创建单链表,需要一个总是指向尾结点的指针
     36 返回一个指向结构体类型的指针,即链表头 
     37 */
     38 LinkList CreatList2(LinkList &L){
     39     L = (LinkList)malloc(sizeof(LNode));
     40     L -> next = NULL;
     41     LNode *s, *r = L;
     42     for(int i = 0; i < 7; i++){
     43         s = (LNode*)malloc(sizeof(LNode));
     44         s->data = i;
     45         
     46         r -> next = s;//将节点s接到尾巴后面,r指向新的尾结点 
     47         r = s;
     48     }  
     49     r -> next = NULL;//千万要记得将尾结点的指针域置空啊 
     50     return L; 
     51 }
     52 /*头插法创建单链表*/
     53 LinkList CreatList1(LinkList &L){
     54     LNode *s;
     55     L = (LinkList)malloc(sizeof(LNode));//创建头结点 
     56     L->next = NULL;//指向空 
     57     
     58     for(int i = 0; i < 7; i++){
     59         s = (LNode*)malloc(sizeof(LNode));
     60         s->data = i;
     61         
     62         s->next = L->next;//先将L的next接到s的后面,然后接头结点 
     63         L -> next = s;
     64     } 
     65     return L; 
     66 }
     67 /*依次打印元素*/
     68 void PrintList(LinkList &L){
     69     LNode *p = L->next;
     70     while(p != NULL){
     71         printf("%d ", p -> data);
     72         p = p->next;
     73     }
     74     puts("");
     75 }
     76 /*计算单链表长度*/
     77 int Length(LinkList &L){
     78     LNode *p = L -> next;
     79     int cnt = 0;
     80     while(p != NULL){
     81         cnt++;
     82         p = p-> next;
     83     }
     84     return cnt;
     85 }
     86 /*插入结点操作,将s插入到第i个位置上,也即前插操作*/
     87 void Insert(LinkList &L, LNode *s, int i){
     88     int Llength = Length(L); 
     89     if(i < 0 || i > Llength)
     90         return;
     91     
     92     LNode *pre = GetElem(L, i - 1);
     93     s -> next = pre -> next;
     94     pre -> next = s;
     95 } 
     96 /*后插结点操作,将s插入到第i个位置之后*/
     97 void BackInsert(LinkList &L, LNode *s, int i){
     98     int Llength = Length(L); 
     99     printf("长度是%d
    ", Llength);
    100     if(i < 0 || i > Llength)
    101         return;
    102     
    103     LNode *p = GetElem(L, i);//一种方法是直接获取第i个结点,插入其后,另一种是不变,交换数据域 
    104     s -> next = p -> next;
    105     p -> next = s;  
    106     
    107     /*int temp = p->data;
    108     p -> data = s -> data;
    109     s -> data = temp;*/
    110 } 
    111 /*删除第i个结点*/
    112 bool DelateElem(LinkList &L, int i){
    113     LNode *pre = GetElem(L, i - 1);
    114     LNode *p = pre -> next;//先指出p,便于之后释放内存 
    115     pre -> next = p->next;
    116     free(p);
    117 } 
    118 int main(){
    119     LinkList L1;
    120     CreatList1(L1);
    121     PrintList(L1);
    122     printf("该链表的长度是:%d
    ",Length(L1)); 
    123     
    124     LinkList L2;
    125     CreatList2(L2);
    126     PrintList(L2);
    127     printf("该链表的长度是:%d
    ",Length(L2));
    128     
    129     LNode *x;
    130     for(int i = 1; i < 7; i++){
    131         x = GetElem(L2, i);
    132         printf("第%d个元素是%d
    ",i, x->data);
    133     }
    134     for(int i = 2; i < 7; i++){
    135         printf("存在值为%d的元素,在第%d个位置上
    ",i, LocateElem(L2, i));
    136     }
    137     
    138     LNode *s = (LNode*)malloc(sizeof(LNode));
    139     s -> data = 99;
    140     s -> next = NULL;
    141     Insert(L2, s, 2);
    142     PrintList(L2);
    143      
    144     LNode *s1 = (LNode*)malloc(sizeof(LNode));
    145     s1 -> data = 99;
    146     s1 -> next = NULL;
    147     //同是s的话是同一个地址,插入就是替换,涉及指针的问题 
    148     BackInsert(L2, s1, 3);//插入到第四个位置 
    149     PrintList(L2);
    150     
    151     DelateElem(L2, 2);
    152     DelateElem(L2, 3);
    153     PrintList(L2);
    154     return 0; 
    155 } 

    2、双链表

      1 #include <cstdio>
      2 #include <cstdlib> 
      3 
      4 typedef struct LNode{
      5     int data;
      6     struct LNode *prior, *next;
      7 }LNode, *LinkList;//定义结构体和结构体指针
      8 
      9 /*初始化*/ 
     10 LinkList InitList(LinkList &L){
     11     L = (LinkList)malloc(sizeof(LNode));
     12     L->data = -1;
     13     L->next = NULL;
     14     L->prior = NULL;
     15     return L; 
     16 } 
     17 /*头插法建立双链表*/
     18 LinkList FrontList(LinkList &L){
     19     L = InitList(L);
     20     
     21     LNode *s;
     22     for(int i = 0; i < 7; i++){
     23         s = (LNode*)malloc(sizeof(LNode));//每次需要新的地址 
     24         s->data = i;
     25         
     26         s->next = L->next;
     27         L->next = s;
     28         s->prior = L;
     29         if(s->next != NULL)
     30             s->next->prior = s;
     31     }
     32     return L;
     33 }
     34 /*尾插法建立双链表*/
     35 LinkList BackList(LinkList &L){
     36     L = InitList(L);
     37     LNode *s, *r = L;
     38     
     39     for(int i = 0; i < 7; i++){
     40         s = (LNode*)malloc(sizeof(LNode));//每次需要新的地址 
     41         s->data = i;
     42         
     43         r->next = s;
     44         s->prior = r;
     45         r = s;
     46     }
     47     r -> next = NULL;
     48     return L;
     49 }
     50 /*求表长*/
     51 int Length(LinkList &L){
     52     LNode *p = L -> next;
     53     int cnt = 0;
     54     while(p){
     55         cnt++;
     56         p = p->next;
     57     }
     58     //L->data = cnt;
     59     return cnt;
     60 }
     61 /*按值查找元素*/
     62 LNode *GetElem(LinkList &L, LNode *e){
     63     LNode *p = L->next;
     64     while(p && p->data != e->data){
     65         p = p->next;
     66     } 
     67     return p;
     68 }
     69 /*按序号查找元素,从1开始*/
     70 LNode *LocateElem(LinkList &L, int x){
     71     int Llength = Length(L);
     72     if(x < 0 || x > Llength)
     73         return NULL;
     74     
     75     LNode *p = L->next;
     76     int cnt = 0;
     77     while(p && cnt < x){
     78         cnt++;
     79         p = p->next;
     80     } 
     81     return p;
     82 }
     83 /*插入,第i个位置*/
     84 bool ListInsert(LinkList &L, LNode *s, int i){
     85     int Llength = Length(L);
     86     if(i < 0 ||i >= Llength)
     87         return false;
     88         
     89     LNode *p = LocateElem(L, i - 1);
     90     s->next = p->next;
     91     p->next = s;
     92     s->next->prior = s;
     93     s->prior = p;
     94 }
     95 /*删除*/
     96 bool ListDelate(LinkList &L, int i, LNode &e){
     97     int Llength = Length(L);
     98     if(i < 0 ||i >= Llength)
     99         return false;
    100         
    101     LNode *q, *p = LocateElem(L, i - 1);
    102     q = p -> next;
    103     e.data = q -> data;
    104     
    105     p->next = q->next;
    106     q->next->prior = p;
    107     free(q);//删除的是第i个位置上的元素啊 
    108 }
    109 /*打印*/
    110 void PrintList(LinkList &L){
    111     printf("正序为:");
    112     LNode *p = L; 
    113     LNode *p1 = NULL;
    114     while(p != NULL){
    115         printf("%d ", p->data);
    116         if(p->next == NULL)
    117             p1 = p;
    118         p = p -> next;
    119     }
    120     puts(""); 
    121     
    122     printf("逆序为:");
    123     while(p1){
    124         printf("%d ", p1->data);
    125         p1 = p1 -> prior;
    126     }
    127     puts("");
    128 }
    129 /*判空*/
    130 bool Empty(LinkList &L){
    131     if(L->next == NULL)
    132         return true;
    133     return false;
    134 }
    135 /*销毁,递归释放内存*/ 
    136 void Destory(LinkList &L, LNode *s){
    137     if(s == NULL){
    138         L->next = NULL;
    139         return;
    140     }
    141         
    142     Destory(L,s->next);
    143     free(s);
    144     s=NULL;
    145     //L->data--;
    146 } 
    147 /*销毁,非递归释放内存*/ 
    148 void Destory2(LinkList &L){
    149     LNode *t,*p = L -> next;
    150     while(p){
    151         t = p -> next;
    152         free(p);
    153         L->data--;
    154         p = t;
    155     }
    156     L -> next = NULL;
    157 } 
    158 
    159 int main()
    160 {
    161     LinkList L2 = BackList(L2);
    162     PrintList(L2);
    163     printf("尾插法表长为%d
    ", Length(L2));
    164     
    165     LinkList L = FrontList(L);
    166     PrintList(L);
    167     printf("头插法表长为%d
    ", Length(L));
    168     
    169     Destory(L2, L2->next);
    170     PrintList(L2);
    171     if(Empty(L2))
    172         printf("空表
    ");
    173         
    174     /*Destory2(L);
    175     PrintList(L);
    176     if(Empty(L))
    177         printf("空表
    ");*/
    178         
    179     PrintList(L);
    180     LNode *x = (LNode*)malloc(sizeof(LNode));
    181     x -> data = 3;
    182     x -> next = x ->prior = NULL; 
    183     printf("查找到值为%d的元素
    ", GetElem(L, x)->data);
    184     for(int i = 0; i < 4; i++)
    185         printf("查序号为%d元素的值为%d
    ",i, LocateElem(L, i)->data);
    186     
    187     x -> data = 99;
    188     ListInsert(L, x, 3);
    189     PrintList(L);
    190     
    191     LNode e;
    192     e.data = -1;
    193     e.next = e.prior = NULL;
    194     ListDelate(L, 3, e);
    195     printf("删除元素的值为%d
    ", e.data);
    196     PrintList(L);
    197     
    198     return 0;
    199 } 
  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/11607935.html
Copyright © 2011-2022 走看看