用于复习链表,自己写的有关链表的一些操作,包括后插前插创建链表,删除,插入,有序合并,查找,遍历,反转,查中间节点,删倒数节点,检测环结构的功能。可以用做C语言实训参考。
#include<iostream>
#include<stdio.h>
using namespace std;
//定义结构体
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//前插法创建链表
void creatList_F(LinkList &L,int n){
L=new LNode;
LNode *p;
L->next=NULL;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//后插法创建链表
void creatList_A(LinkList &L,int n){
L=new LNode;
LNode *r=L,*p;
L->next=NULL;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
//遍历输出链表
void dumpList(LinkList &L){
LNode *p = L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//查找链表
LinkList LocateElem(LinkList &L,int n){
LinkList p = L;
int j=1;
while(p&&p->data!=n){
p=p->next;
}
return p;
}
//插入链表
void insertList(LinkList &L,int i,int n){
LinkList p=L;
int j=0;
while(p&&(j<i-1)){
p=p->next;
j++;
}
LinkList s = new LNode;
s->data=n;
s->next=p->next;
p->next=s;
}
//链表反转
void reserve(LinkList &L){
LinkList p=L->next,q=NULL,pr;
L->next=NULL;
while(p){
pr= p->next;
p->next=q;
q=p;
p=pr;
}
L->next=q;
}
//链表中间节点
LinkList middlepoint(LinkList &L){
LinkList p1,p2;
p1=L->next;
p2=L->next;
while((p2->next)&&(p2->next->next)){
p1=p1->next;
p2=p2->next->next;
}
return p1;
}
//删除链表节点
void deletepoint(LinkList &L,int n){
LinkList p = L;
int j=1;
while(j<n){
p=p->next;
j++;
}
p->next=p->next->next;
}
//删除链表倒数第n个结点
void deleteafter(LinkList &L,int n){
LinkList s=L,p=L;
int j=0;
while(j<=n){
p=p->next;
j++;
}
while(p){
s=s->next;
p=p->next;
}
s->next=s->next->next;
}
//合并两个有序链表
void mergeList(LinkList &L1,LinkList &L2){
LinkList prehead=new LNode;
LinkList p = prehead;
L1=L1->next;
L2=L2->next;
while(L1!=NULL&&L2!=NULL){
if(L1->data<=L2->data){
p->next=L1;
L1=L1->next;
}else{
p->next=L2;
L2=L2->next;
}
p=p->next;
}
p->next=L1==NULL?L2:L1;
dumpList(prehead);
}
//链表中环的检测
void checkRing(LinkList &L){
LinkList f,s;
f=L,s=L;
s=s->next;
f=f->next->next;
while(f&&(f!=s)){
s=s->next;
f=f->next->next;
}
if(f==s) cout<<1<<endl;
else cout<<0<<endl;
}
int main(){
// LinkList L,H;
// creatList_F(H,5);
// dumpList(H);
// L=middlepoint(H);
// cout<<L->data<<endl;
//
// insertList(H,2,10);
// dumpList(H);
//
// deleteafter(H,2);
// dumpList(H);
//
// deletepoint(H,2);
// dumpList(H);
//
// L=LocateElem(H,10);
//
// reserve(H);
// dumpList(H);
// LinkList p1,p2;
// creatList_A(p1,3);
// creatList_A(p2,4);
// mergeList(p1,p2);
// checkRing(p2);
return 0;
}
//有序链表合并样例
//1 2 4 1 3 4 6