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 } 
  • 相关阅读:
    Oracle 数据库对象
    oracle基础知识
    中文乱码问题
    会话技术Cookie&Session
    HttpServletRequest请求
    JAVA基础之设置随机成语验证码
    HttpServletResponse响应
    Spring注解 AOP@Aspect
    Visual studio Code使用技巧
    缓存相关
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/11607935.html
Copyright © 2011-2022 走看看