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

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\t",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 ****************************************/

 

posted @ 2018-11-08 22:38  Cruel_King  阅读(478)  评论(0编辑  收藏  举报