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 ****************************************/