• 线性表链式结构基本操作的实现


    2018-11-10-15:10:42

      1 /*********************************************************
      2     创建一个带头结点的单链表,并实现其增删合并和打印等基本操作。
      3     main函数操作:
      4         1.输入第一个链表的元素个数,以及具体元素。
      5         2.打印该链表。
      6         3.输入需要插入在某个位置的值。
      7         4.打印插入后的链表。
      8         5.输入需要删除元素在链表中的位置。
      9         6.打印删除元素后的链表。
     10         7.输入第二个链表的元素个数,以及具体元素。
     11         8.返回二继续执行上述2-6步骤并在第六个步骤完成时跳出。
     12         9.将两个链表合并。
     13         10.打印合并后的链表。
     14 **********************************************************/
     15 #include <cstdio>
     16 #include <cstdlib>
     17 #include <iostream>
     18 using namespace std;
     19 
     20 typedef int Elemtype;
     21 typedef struct node{
     22     int length;//用头结点储存链表的当前长度
     23     Elemtype Date;
     24     struct node*Next;
     25 }Node,*LinkList;
     26 
     27 LinkList InitNode();
     28 LinkList InsertNode(LinkList Head,Elemtype elem,int aidelem_locate);
     29 LinkList DeleteNode(LinkList Head,Elemtype *elem,int aidelem_locate);
     30 LinkList MergeList(LinkList&Head1,LinkList&Head2);
     31 void Printlist(LinkList Head);
     32 //main函数内所有数据均为测试数据,读者可根据自己测试方式自行调换
     33 int main()
     34 {
     35     LinkList Head1,Head2;
     36     Head1=InitNode();
     37     cout<<"List 1 : "<<endl;
     38     int Maxnumber1;
     39     Elemtype elem1;
     40     cin>>Maxnumber1;
     41     for(int i=1;i<=Maxnumber1;i++){
     42         cin>>elem1;
     43         InsertNode(Head1,elem1,i);
     44     }
     45     Printlist(Head1);
     46     Elemtype elem2;
     47     int index1;
     48     cin>>elem2>>index1;
     49     InsertNode(Head1,elem2,index1);
     50     Printlist(Head1);
     51     int elem3,index2;
     52     cin>>index2;
     53     DeleteNode(Head1,&elem3,index2);
     54     cout<<"Delete date is in ListHead1 is "<<elem3<<endl;
     55     Printlist(Head1);
     56 
     57     cout<<"List 2 : "<<endl;
     58     Head2=InitNode();
     59     int Maxnumber2;
     60     Elemtype elem4;
     61     cin>>Maxnumber2;
     62     for(int i=1;i<=Maxnumber2;i++){
     63         cin>>elem4;
     64         InsertNode(Head2,elem4,i);
     65     }
     66     Printlist(Head2);
     67     Elemtype elem5;
     68     int index3;
     69     cin>>elem5>>index3;
     70     InsertNode(Head2,elem5,index3);
     71     Printlist(Head2);
     72     int elem6,index4;
     73     cin>>index4;
     74     DeleteNode(Head2,&elem6,index4);
     75     cout<<"Delete date in ListHead2 is "<<elem6<<endl;
     76     Printlist(Head2);
     77     char c;
     78     cout<<"Are you sure you want to merge the two lists above?"<<endl<<"input Y or N "<<endl;
     79     cin>>c;
     80     if(c=='Y'){
     81         LinkList Merge;
     82         Merge=MergeList(Head1,Head2);
     83         Printlist(Merge);
     84     }
     85     return 0;
     86 }
     87 
     88 LinkList InitNode(){
     89     LinkList Head;
     90     Head=(LinkList)malloc(sizeof(Node));
     91     Head->Next=NULL;
     92     Head->length=0;
     93     return Head;
     94 }
     95 
     96 LinkList InsertNode(LinkList Head,Elemtype elem,int aidelem_locate){
     97     if(Head->Next==NULL){
     98         LinkList q;
     99         q=(LinkList)malloc(sizeof(Node));
    100         Head->Next=q;
    101         q->Date=elem;
    102         q->Next=NULL;
    103         Head->length++;
    104         return Head;
    105     }
    106     else if(aidelem_locate==Head->length+1){
    107         LinkList q,p;
    108         for(q=Head->Next;q->Next;q=q->Next);
    109         p=(LinkList)malloc(sizeof(Node));
    110         q->Next=p;
    111         p->Next=NULL;
    112         p->Date=elem;
    113         Head->length++;
    114         return Head;
    115     }
    116     else{
    117         if(aidelem_locate<=Head->length){
    118             int i;
    119             LinkList p,q;
    120             for(q=Head->Next,i=1;i<aidelem_locate-1;q=q->Next,i++);
    121             if(aidelem_locate==1)
    122                 q=Head;
    123             p=(LinkList)malloc(sizeof(Node));
    124             p->Next=q->Next;
    125             q->Next=p;
    126             p->Date=elem;
    127             Head->length++;
    128             return Head;
    129         }
    130         else    return Head;
    131     }
    132 }
    133 
    134 LinkList DeleteNode(LinkList Head,Elemtype*elem,int aidelem_locate){
    135     if(aidelem_locate==1){
    136       LinkList p,q;
    137       q=Head->Next;
    138       *elem=q->Date;
    139       p=Head->Next->Next;
    140       Head->Next=p;
    141       free(q);
    142       return Head;
    143     }
    144     else if(aidelem_locate==Head->length){
    145       int i;
    146       LinkList q;
    147       for(q=Head->Next,i=1;i<aidelem_locate-1;q=q->Next,i++);
    148       *elem=q->Date;
    149         LinkList p=q->Next;
    150       q->Next=NULL;
    151       free(p);
    152       return Head;
    153     }
    154     else{
    155       int i;
    156       LinkList q;
    157       for(q=Head->Next,i=1;i<aidelem_locate-1;q=q->Next,i++);
    158       *elem=q->Date;
    159       q->Next=q->Next->Next;
    160       return Head;
    161     }
    162 }
    163 
    164 LinkList MergeList(LinkList&Head1,LinkList&Head2){
    165     LinkList pa,pb,pc,Merge;
    166     pa=Head1->Next;
    167     pb=Head2->Next;
    168     Merge=pc=Head1;
    169     while(pa&&pb){
    170         if(pa->Date<=pb->Date){
    171             pc->Next=pa;pc=pa;pa=pa->Next;
    172         }
    173         else{
    174             pc->Next=pb;pc=pb;pb=pb->Next;
    175         }
    176         pc->Next=pa?pa:pb;
    177         free(Head2);
    178     }
    179     return Merge;
    180 }
    181 
    182 void Printlist(LinkList Head){
    183     LinkList p;
    184     int flag;
    185     for(p=Head->Next,flag=1;p;p=p->Next,flag++){
    186         printf("%d	",p->Date);
    187         if(Head->length%5!=0&&flag%5==0)
    188             cout<<endl;
    189     }
    190     cout<<endl;
    191 }
    192 /****************************************
    193     Author:CRUEL_KING
    194     Time:2018/11/9
    195     Program name:带头结点的单链表基本操作的实现.cpp
    196 ****************************************/
  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/bianjunting/p/9932530.html
Copyright © 2020-2023  润新知