线性表链式结构基本操作的实现
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 ****************************************/
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!