zoukankan      html  css  js  c++  java
  • C语言实现链表

    单向链表:

      1 #include <cstdio>
      2 using namespace std;
      3 struct LNode{
      4     int data;
      5     struct LNode * next;
      6 };
      7 struct LinkList{
      8     LNode * head,tail;
      9     int len;
     10 };
     11 void InitList(LinkList &L){
     12     L.len = 0;
     13     L.head->next = NULL;
     14 }
     15 void CreateList_L(LinkList &L,int n){
     16     L.len = n;
     17     LNode* & head = L.head;
     18     head = new LNode();
     19     head -> next =NULL;
     20     while(n--){
     21         LNode *p = new LNode();
     22         scanf("%d",&p->data);
     23         p->next = head->next;
     24         head->next=p;
     25     }
     26 }
     27 void CreateList(LinkList &L,int n){
     28     L.len = n;
     29     L.head = new LNode;
     30     LNode *p = L.head;
     31     while(n--){
     32         LNode * t =new LNode();
     33         scanf("%d",&t->data);
     34         p->next = t;
     35         p = t;
     36     }
     37     p->next  = NULL;
     38 }
     39 void ListTraverse(LinkList L,void (visit)(LNode*)){
     40     LNode *p =L.head->next;
     41     while(p!=NULL){
     42         visit(p);
     43         p = p->next;
     44     }
     45 }
     46 int ListInsert_L(LinkList &L,int i, int data){
     47     LNode * p =L.head;
     48     int j = 0;
     49     while(p&&j++<i ){
     50         p=p->next;
     51     }
     52     if(!p || i<0)return 0;
     53     LNode *t = new LNode();
     54     t->data = data;
     55     t->next = p->next;
     56     p->next = t;
     57     L.len++;    
     58     return 1;
     59 }
     60 int ListDelete_L(LinkList &L,int i,int &data){
     61     LNode *p = L.head;
     62     int j=0;
     63     while(p&&j++<i){
     64         p = p->next;
     65     }
     66     if(!(p->next) || i <0)return 0;
     67     LNode *t = p->next;
     68     p->next = p->next->next;
     69     data=t->data;
     70     delete t;
     71     L.len--;
     72     return 1;
     73 }
     74 int GetElem_L(LinkList L,int i,int &data){
     75     LNode *p = L.head;
     76     int j=0;
     77     while(p && j++<=i) p=p->next;
     78     if(!p|| i<0 )return 0;
     79     data=p->data;
     80     return 1;
     81 }
     82 int MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
     83     LNode *pa = La.head -> next;
     84     LNode *pb = Lb.head -> next;
     85     Lc.head=new LNode();
     86     LNode *pc = Lc.head;
     87     while(pa&&pb){
     88         if(pa->data < pb->data){
     89             pc->next = pa;
     90             pa = pa->next;
     91         }
     92         else{
     93             pc->next = pb;
     94             pb = pb->next;
     95         }
     96         pc = pc -> next;
     97     }
     98     pc->next = pa == NULL?pb:pa;
     99 }
    100 void visit(LNode *p){
    101     printf("%d
    ",p->data);
    102 }
    103 int main(){
    104     LinkList list,list2,list3 ;
    105   //  InitList(list);
    106     CreateList(list,5);
    107     CreateList(list2,5);
    108     MergeList(list,list2,list3);
    109     //ListInsert_L(list,-1,6);
    110     //int v =123;
    111     //GetElem_L(list,4,v);
    112     //printf("%d",v);
    113     ListTraverse(list3,visit);
    114     return 0;
    115 }

    循环链表:

      1 #include <cstdio>
      2 #include <stack>
      3 using namespace std;
      4 struct LNode{
      5     int data;
      6     struct LNode * next;
      7 };
      8 struct LinkList{
      9     LNode * head,*tail;
     10     int len;
     11 };
     12 void CreateList_L(LinkList &L,int n){
     13     L.len = n;
     14     LNode* & head = L.head;
     15     head = new LNode();
     16     head -> next =head;
     17     while(n--){
     18         LNode *p = new LNode();
     19         scanf("%d",&p->data);
     20         p->next = head->next;
     21         head->next=p;
     22     }
     23 }
     24 void CreateList(LinkList &L,int n){
     25     L.len = n;
     26     L.head = new LNode;
     27     LNode *p = L.head;
     28     while(n--){
     29         LNode * t =new LNode();
     30         scanf("%d",&t->data);
     31         p->next = t;
     32         p = t;
     33     }
     34     p->next  = L.head;
     35 }
     36 void ListTraverse(LinkList L,void (visit)(LNode*)){
     37     LNode *p =L.head->next;
     38     while(p!=L.head){
     39         visit(p);
     40         p = p->next;
     41     }
     42 }
     43 int ListInsert_L(LinkList &L,int i, int data){
     44     LNode * p =L.head;
     45     int j = 0;
     46     while((p!=L.head||!j)&&j++<i){
     47         p = p->next;
     48     }
     49     if( p == L.head&&j || i<0)return 0;
     50     LNode *t = new LNode();
     51     t->data = data;
     52     t->next = p->next;
     53     p->next = t;
     54     L.len++;    
     55     return 1;
     56 }
     57 int ListDelete_L(LinkList &L,int i,int &data){
     58     LNode *p = L.head;
     59     int j=0;
     60     while((p!=L.head||!j)&&j++<i){
     61         p = p->next;
     62     }
     63     if((p->next)==L.head || i <0)return 0;
     64     LNode *t = p->next;
     65     p->next = p->next->next;
     66     data=t->data;
     67     delete t;
     68     L.len--;
     69     return 1;
     70 }
     71 int GetElem_L(LinkList L,int i,int &data){
     72     LNode *p = L.head;
     73     int j=0;
     74     while((p!=L.head||!j) && j++<=i) p=p->next;
     75     if(p==L.head&&j|| i<0 )return 0;
     76     data=p->data;
     77     return 1;
     78 }
     79 void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
     80     LNode *pa = La.head -> next;
     81     LNode *pb = Lb.head -> next;
     82     Lc.head=new LNode();
     83     LNode *pc = Lc.head;
     84     while(pa!=La.head&&pb!=Lb.head){
     85         if(pa->data < pb->data){
     86             pc->next = pa;
     87             pa = pa->next;
     88         }
     89         else{
     90             pc->next = pb;
     91             pb = pb->next;
     92         }
     93         pc = pc -> next;
     94     }
     95     if(pa==La.head){
     96         pc->next = pb;
     97         while(pb->next!=Lb.head)pb=pb->next;
     98         pb->next=Lc.head;
     99     }
    100     else {
    101         pc->next = pa;
    102         while(pa->next!=La.head)pa=pa->next;
    103         pa->next=Lc.head;        
    104     }
    105 
    106 }
    107 void visit(LNode *p){
    108     printf("%d
    ",p->data);
    109 }
    110 int main(){
    111     LinkList list,list2,list3 ;
    112   //  InitList(list);
    113     CreateList(list,5);
    114     //CreateList(list2,5);
    115 
    116     //MergeList(list,list2,list3);
    117     int v =123;
    118     //ListDelete_L(list,5,v);
    119     //
    120     //
    121     GetElem_L(list,4,v);
    122     printf("%d",v);
    123     ListTraverse(list,visit);
    124     return 0;
    125 }

    循环链表:

      1 #include <cstdio>
      2 using namespace std;
      3 struct Node{
      4     int data;
      5     struct Node * prev;
      6     struct Node * next;
      7 };
      8 struct LinkList{
      9     Node * head;
     10     int len; 
     11 };
     12 void CreateList_L(LinkList &L, int n){
     13     L.len = n;
     14     L.head = new Node();
     15     Node * head = L.head;
     16     head->next = NULL;
     17     head->prev = NULL;
     18     while(n--){
     19         Node *t  = new Node();
     20         scanf("%d",&t->data);
     21         Node * d = head->next;
     22         t->prev = head;
     23         head->next = t;
     24         t->next = d;
     25         if(d) d->prev = t;
     26     }
     27 }
     28 void CreateList(LinkList &L,int n){
     29     L.len = n;
     30     L.head = new Node();
     31     Node * p = L.head;
     32     while(n--){
     33         Node *t = new Node();
     34         scanf("%d",&t->data);
     35         p->next = t;
     36         t->prev = p;
     37         p = t;
     38     }
     39     p->next = NULL;
     40 }
     41 void visit(Node *p){
     42     printf("%d",p->data);
     43 }
     44 void ListTraverse(LinkList L,void (visit)(Node*)){
     45     Node *p = L.head->next;
     46     while(p->next!=NULL){
     47         visit(p);
     48         p = p->next;
     49     }
     50     visit(p);
     51     printf("
    ");
     52     while(p->prev!=NULL){
     53         visit(p);
     54         p = p->prev;
     55     }
     56 }
     57 int ListInsert_L(LinkList &L,int i ,int data){
     58     Node * p = L.head;
     59     int j = 0;
     60     while(p&&j++ < i)p = p->next;
     61     if(!p||i<0)return 0;
     62     Node * t = new Node();
     63     t->data = data;
     64     Node * n = p->next;
     65     p->next = t;
     66     t->prev = p;
     67     if(n)n->prev = t;
     68     t->next = n;
     69     return 1;
     70 }
     71 int ListDelete_L(LinkList &L,int i,int &data){
     72     Node * p = L.head;
     73     int j = 0; 
     74     while(p && j++ < i) p = p->next;
     75     if((!p||!p->next) || i < 0) return 0;
     76     Node * n = p->next;
     77     data = n->data;
     78     if(n->next)n->next->prev = p;
     79     p->next = n->next;
     80     delete n;
     81     return 1;
     82 }
     83 void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){
     84     Node * pa = La.head->next;
     85     Node * pb = Lb.head->next;
     86     Lc.head = new Node();
     87     Node * pc = Lc.head;
     88     pc->prev = NULL;
     89     while(pa && pc){
     90         if(pa->data < pb->data){
     91             pc->next = pa;
     92             pc->next->prev = pc;
     93             pa = pa->next;
     94         }
     95         else{
     96             pc->next = pb;
     97             pc->next->prev = pc;
     98             pb = pb->next;
     99         }
    100         pc = pc->next;
    101     }
    102     if(pa) {
    103         pc->next = pa;
    104         pa->prev = pc;
    105     }
    106     else{
    107         pc->next = pb;
    108         pb->prev = pc;
    109     }
    110 }
    111 int GetElem_L(LinkList L,int i,int &data){
    112     Node * p = L.head->next;
    113     int j = 0;
    114     while(p && j++ < i) p = p->next;
    115     if(!p || i < 0)return 0;
    116     data = p->data;
    117     return data;
    118 }
    119 int main(){
    120     LinkList list,list1,list2;
    121     CreateList(list,5);
    122     CreateList(list1,5);
    123     MergeList(list,list1,list2);
    124     //printf("[%d]",v);
    125     ListTraverse(list2,visit);
    126     return 0;
    127 }
  • 相关阅读:
    修改表中的列
    查看表中都有什么约束
    数据库关系图
    删除约束
    T_SQL 语句想已有数据表添加约束
    判断回文联
    python自定义函数可以向前引用不用声明
    所有参数的和乘以基数
    子字符串在目标字符串中出现的次数
    除二取余倒序排列
  • 原文地址:https://www.cnblogs.com/Wade-/p/6349344.html
Copyright © 2011-2022 走看看