数据结构——单链表

  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 }

第一次写,如果有错,请评论区指出,谢谢!

posted @ 2019-07-23 08:55  weigm*  阅读(80)  评论(0)    收藏  举报