数据结构——单链表
1 // program.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 6 #include <iostream> 7 using namespace std; 8 9 typedef struct LNode{ 10 int data; 11 struct LNode *next; 12 }LNode,*LinkList; 13 //头插法创表 14 LinkList CreateList1(LinkList &L){ 15 LNode *s; 16 int n; 17 L=(LinkList)malloc(sizeof(LNode)); 18 L->next=NULL; 19 cout<<"请输入n:"<<endl; 20 cin>>n; 21 cout<<"请输入数据表:"<<endl; 22 for(int i=1;i<=n;i++){ 23 s=(LNode*)malloc(sizeof(LNode)); 24 cin>>s->data; 25 s->next=L->next; 26 L->next=s; 27 } 28 return L; 29 } 30 //尾插法创表 31 LinkList CreateList2(LinkList &L){ 32 int n; 33 L=(LinkList)malloc(sizeof(LNode)); 34 LNode *s,*r=L; 35 cout<<"请输入n:"<<endl; 36 cin>>n; 37 cout<<"请输入数据表:"<<endl; 38 for(int i=1;i<=n;i++){ 39 s=(LNode*)malloc(sizeof(LNode)); 40 cin>>s->data; 41 r->next=s; 42 r=s; 43 } 44 r->next=NULL; 45 return L; 46 } 47 //按序号查找节点值 48 LNode *GetElem(LinkList L,int i){ 49 int j=1; 50 LNode *p=L->next; 51 if(i==0) 52 return L; 53 if(i<1) 54 return NULL; 55 while(p&&j<i){ 56 p=p->next; 57 j++; 58 } 59 return p; 60 } 61 //按值查找表节点 62 LNode *LocateElem(LinkList L,int e){ 63 LNode *p=L->next; 64 while(p!=NULL&&p->data!=e) 65 p=p->next; 66 return p; 67 } 68 //前插法插入 69 LinkList ListInsert1(LinkList &L,int i){ 70 LNode *s,*p=GetElem(L,i-1); 71 s=(LNode*)malloc(sizeof(LNode)); 72 cout<<"输入插入元素:"<<endl; 73 cin>>s->data; 74 s->next=p->next; 75 p->next=s; 76 return L; 77 } 78 //后插法插入 79 LinkList ListInsert2(LinkList &L,int i){ 80 int temp=0; 81 LNode *s,*p=GetElem(L,i); 82 s=(LNode*)malloc(sizeof(LNode)); 83 cout<<"输入插入元素:"<<endl; 84 cin>>s->data; 85 s->next=p->next; 86 p->next=s; 87 temp=p->data; 88 p->data=s->data; 89 s->data=temp; 90 return L; 91 } 92 //删除p 93 LinkList ListDelete1(LinkList &L,int i){ 94 LNode *q,*p=GetElem(L,i-1); 95 q=(LNode*)malloc(sizeof(LNode)); 96 q=p->next; 97 p->next=q->next; 98 free(q); 99 return L; 100 } 101 //删除q 102 LinkList ListDelete2(LinkList &L,int i){ 103 LNode *q,*p=GetElem(L,i); 104 q=(LNode*)malloc(sizeof(LNode)); 105 q=p->next; 106 p->data=p->next->data; 107 p->next=q->next; 108 free(q); 109 return L; 110 } 111 void PrintLnode(LinkList &L){ 112 LNode *p=L->next; 113 while(p!=NULL){ 114 cout<<p->data<<" "; 115 p=p->next; 116 } 117 cout<<endl; 118 } 119 //翻转1 120 LinkList Reverse_1(LinkList L){ 121 LinkList r; 122 LNode *p; 123 p=L->next; 124 L->next=NULL; 125 while(p!=NULL){ 126 r=p->next; 127 p->next=L->next; 128 L->next=p; 129 p=r; 130 } 131 return L; 132 } 133 //翻转2 134 LinkList Reverse_2(LinkList L){ 135 LNode *pre,*p=L->next,*r=p->next; 136 p->next=NULL; 137 while(r!=NULL){ 138 pre=p; 139 p=r; 140 r=r->next; 141 p->next=pre; 142 } 143 L->next=p; 144 return L; 145 } 146 147 void main(){ 148 LinkList L; 149 int x,y; 150 CreateList2(L); 151 cout<<"创建后输出:"<<endl; 152 PrintLnode(L); 153 154 cout<<"输入要求删除节点序号:"<<endl; 155 cin>>x; 156 ListDelete2(L,x); 157 cout<<"删除后输出:"<<endl; 158 PrintLnode(L); 159 160 cout<<"输入要求插入节点序号:"<<endl; 161 cin>>y; 162 ListInsert2(L,y); 163 cout<<"插入后输出:"<<endl; 164 PrintLnode(L); 165 166 Reverse_2(L); 167 cout<<"翻转后输出:"<<endl; 168 PrintLnode(L); 169 } 170 171 /****************************************两个单链表合并输出************************************************/ 172 LinkList UnionList(LinkList la,LinkList lb){//需要一个升序,一个降序。 173 LNode *p,*q,*pre,*s; 174 p=lb->next; 175 lb->next=NULL; 176 while(p){ 177 s=p->next; 178 p->next=lb->next; 179 lb->next=p; 180 p=s; 181 } 182 p=la->next; 183 q=lb->next; 184 pre=la; 185 while(p&&q){ 186 if(p->data<q->data){ 187 pre->next=p; 188 pre=p; 189 p=p->next; 190 } 191 else{ 192 pre->next=q; 193 pre=q; 194 q=q->next; 195 } 196 } 197 if(p) 198 pre->next=p; 199 else 200 pre->next=q; 201 free(lb); 202 return la; 203 } 204 205 /****************************************删除无序链表的重复元素******************************************/ 206 LNode *Delete_same(LNode *L){ 207 LNode *p,*q,*t; 208 p=L->next; 209 while(p!=NULL){ 210 q=p; 211 while(q->next!=NULL){ 212 if(p->data==q->next->data){ 213 t=q->next; 214 q->next=t->next; 215 free(t); 216 } 217 else 218 q=q->next; 219 } 220 p=p->next; 221 } 222 return L; 223 }
第一次写,如果有错,请评论区指出,谢谢!

浙公网安备 33010602011771号