线性表链表实现

匿名 (未验证) 提交于 2019-12-03 00:13:02
  1 #include<bits/stdc++.h>   2 using namespace std;   3 #define sc scanf   4 #define ElemType int    5 //线性表的链式表示和实现   6    7 typedef struct LNode{   8     int data;   9     struct LNode *next;  10 }LNode,*LinkList;  11 //关于上面为啥是这样子的,看下面链接即可  12 //https://zhidao.baidu.com/question/489369235.html  13    14 //创建链表,有n个结点   15 void CreateList(LinkList &L,int n)  16 {  17     L = (LinkList)malloc(sizeof(LNode));  18     L->next = NULL;//创建一个带头结点的单链表  19     L->data = 0;//用于记录当前链表的元素个数   20       21     LNode *p;  22     for(int i = n;i > 0;i--)  23     {  24         p = (LinkList)malloc(sizeof(LNode));//生成新节点   25         sc("%d",&p->data);  26         p->next = L->next;  27         L->next = p;  28     }   29 }   30   31 //插入元素  32 bool LinkInsert_L(LinkList &L,int i,ElemType e)  33 {  34     LNode *p = L;   35     int j = 0;  36     while(p && j < i - 1)  37     {  38         p = p->next;  39         ++j;  40     }  41       42     //判断是否非法位置  43     if(!p || j > i - 1) {  44         puts("Oh! Baby! The insertion position is invalid. Please re-enter the insertion position!");  45         return 0;   46     }  47       48     LNode *s = (LinkList)malloc(sizeof(LNode));  49     s->data = e;  50     s->next = p->next;  51     p->next = s;  52     return 1;  53 }   54   55 //链表删除元素  56 bool ListDelete_L(LinkList &L,int i,int &e)  57 {  58   //删除第i个元素   59   LNode *p = L; int j = 0;  60       while(p->next && j < i - 1)  61     {  62         p = p->next;  63         ++j;  64     }  65       66     //判断是否非法位置  67     if(!(p->next) || j > i - 1) {  68         puts("Oh! Baby! The position is invalid. Please re-enter the position!");  69         return 0;   70     }  71       72     LNode *q = (LinkList)malloc(sizeof(LNode));  73     q = p->next;  74     p->next = q->next;  75     e = q->data;  76     free(p);  77     return 1;   78 }   79   80 //合并链表  81 void MergeList(LinkList &la,LinkList &lb,LinkList &lc)  82 {  83     LNode *pa,*pb,*pc;  84     pa = la->next; pb = lb->next;  85     lc = pc = la;  86       87     while(pa && pb)  88     {  89         if(pa->data <= pb->data){  90             pc->next = pa;  91             pc = pa;  92             pa = pa->next;  93         }  94         else{  95             pc->next = pb;  96             pc = pb;  97             pb = pb->next;  98         }  99     }     100     pc->next = pa? pa:pb; 101     free(lb); 102 }  103  104 //获取链表长度 105 int getListLength(LinkList &L) 106 { 107     LNode *p = L; 108     int cnt = 0; 109     while(p->next != NULL) 110     { 111         p = p->next; 112         ++cnt; 113         //cout << p->data << " "; 114     } 115     return cnt; 116 } 117  118 //获取链表的某个元素 119 bool getElem(LinkList &L,int q,int &e) { 120      121     int length = getListLength(L); 122     if(q < 1 || q > length) 123     { 124         puts("Oh! Baby! The  position is invalid. Please re-enter the position!"); 125         return 0; 126     } 127     LNode *p = L; 128     int j = 0; 129     while(p->next && j < q - 1) 130     { 131         p = p->next; 132         j++; 133     } 134     if(p->next == NULL) 135     { 136         puts("Sorry, didn't find it"); 137         return 0; 138     } 139     else{ 140         p = p->next; 141         e = p->data; 142         return 1; 143     } 144 } 145  146 void Reverse_List(LinkList &la,LinkList &lb) 147 { 148       LNode *p = la; 149       while(p->next != NULL) 150       { 151           p = p->next; 152           if(p != NULL) 153           LinkInsert_L(lb,1,p->data); 154     } 155 } 156  157 //遍历链表  158 void LinkList_Traver(LinkList &L) 159 { 160     LNode *p = L; 161     puts("Let's do it! Traver! Traver_List!");  162     while(p->next != NULL) 163     { 164         p = p->next; 165         cout << p->data << " "; 166     } 167     puts(""); 168 }  169  170 //销毁链表  171 bool List_Destroed(LinkList &L) 172 { 173     LNode *p; 174     if(L == NULL) return 0; 175     while(L->next) 176     { 177         p = L->next; 178         free(L); 179         L = p; 180      }  181     return 1; 182 } 183 int main() 184 { 185     LinkList la,lb,lc,ld; 186     int n; 187     sc("%d",&n); 188     CreateList(la,n); 189     CreateList(lb,n); 190     CreateList(ld,0); 191      192      193 //    for(int i = 1;i <= 5;i++) 194 //    { 195 //        LinkInsert_L(la,i,i); 196 //    } 197      198     cout << "la length = " << getListLength(la) << endl; 199     cout << "lb length = " << getListLength(lb) << endl; 200      201     int ele; 202     if(getElem(la,5,ele)) 203     { 204         cout << ele << endl; 205     } 206      207     if(getElem(lb,1,ele)) 208     { 209         cout << ele << endl; 210     } 211      212     LinkList_Traver(la); 213     LinkList_Traver(lb); 214      215     MergeList(la,lb,lc); 216     LinkList_Traver(la); 217     LinkList_Traver(lc); 218      219     Reverse_List(la,ld); 220     cout << "Traver ld = "; 221     LinkList_Traver(ld); 222      223     List_Destroed(la); 224     LinkList_Traver(la); 225     return 0;; 226 }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!