链表实验操作(C/C++)

listLinkMsin.cpp

#include <iostream>
using namespace std;
#include "listLink.h" 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	int q;
	cout<<"请输入数字构成链表,输入999结束\n";
	LinkList L=CreatListLink(L);
	//打印输出链表
	show(L);
	
	cout<<"==========执行指定位置插入==============="<<endl;
	cout<<"请输入要插入的数字\n";
	cin>>q;
	//选择指定位置插入 
	InsertListLink(L,q);
	cout<<"插入节点后的链表为"<<endl; 
	show(L);
	
	cout<<"============执行删除指定位置=================="<<endl;
	//指定位置删除
	DeleteListLink(L);
	show(L); 
	
	cout<<"=============反转链表========================"<<endl;
	TranVerseListLink(L);
	show(L);
	cout<<"=================合并链表===================="<<endl;
	//创建三个链表 
	cout<<"请输入数字构成链表,输入999结束\n";
	LinkList B=CreatListLink1(B);
	cout<<"====链表B====="<<endl;
	show(B); 
	cout<<"====链表L====="<<endl;
	show(L); 
	cout<<"输入999"<<endl; 
	LinkList C=CreatListLink1(C);
	cout<<"====合并完成的链表======"<<endl; 
	MergeListLink(L,B,C);
	show(C);
	 

	
	return 0;
}

datastru.h

//包含标识符常量的定义和status类型的定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW  -2

typedef int Status;
 

listLink.h

//包含单链表的储存类型描述和基本运算的声明
 #include "datastru.h" 
 typedef int ElemType;
 typedef struct LNode{
 	ElemType data;
 	LNode *next;
 	
 }LNode,*LinkList;
 
 //初始化链表
Status InitListLink(LinkList &L); 
 
 //头插法创建链表 
LinkList CreatListLink(LinkList &L);
//尾插法创建链表 
LinkList CreatListLink1(LinkList &L);
 
 //指定位置插入节点
 Status InsertListLink(LinkList &L,ElemType e);
 
 //删除链表指定位置元素
 Status DeleteListLink(LinkList &L); 
 
 //反转链表  采用头插断尾法 
 void TranVerseListLink(LinkList &L);
 
 //合并链表
LNode *MergeListLink(LinkList &L,LinkList &B, LinkList &C); 
 
 //查找节点位置 
 LNode *getIndex(LinkList L);
 
 //获取链表长度 
 int getLength(LinkList &L);
 
 //打印
 void show(LinkList L); 

listLink.cpp

//包含单链表基本运算的实现和复杂运算的实现。
#include<iostream>
#include<stdlib.h>
#include<cassert>
using namespace std;
#include "listLink.h"


//初始化链表 
Status InitListLink(LinkList &L){
L=(LNode *) malloc(sizeof(LinkList));
	L->next=NULL;
	return OK; 
}

//采用头插法创建链表
LinkList  CreatListLink(LinkList &L){
InitListLink(L);
		int x=0;
		cin>>x;
		while(x!=999){
			//如果内存不为空,申请一个节点P
		LNode *p=(LNode *) malloc(sizeof(LNode));
			//新建的节点内容指向传进来的数据 
		p->data=x;
		//采用头插法插数据,新建节点的next域指向头节点的next域NULL 
		p->next=L->next;
		//头节点的next域指向新加入节点的地址
		L->next=p;
		cin>>x;
	}
	return L;
} 

//采用尾插法创建链表
LinkList CreatListLink1(LinkList &L){
	InitListLink(L);
	int x=0;
	cin>>x;
	LNode *r=L;
	
	while(x!=999){
	//如果内存不为空,申请一个节点P
	LNode *p=(LNode *) malloc(sizeof(LNode));
	//新建的节点内容指向传进来的数据 
		p->data=x;
		r->next=p;
		r=p;
		cin>>x;
	
	}
		r->next=NULL;
		return L;
	
} 

//指定位置插入节点
Status InsertListLink(LinkList &L, ElemType e){
 
	//申请一个新节点,来充当要插入的节点 
	LNode* pnew=(LinkList) malloc(sizeof(LNode));
	//查找我们要插入的位置 
	LNode *p=getIndex(L);
	pnew->data=e;
	pnew->next=p->next;
	p->next=pnew;
	
	return OK; 
	
	
	
} 

//删除链表中指定位置上的元素
Status DeleteListLink(LinkList &L){
	//新建一个节点用来储存查找到的节点的上一个节点 
	LNode *p=getIndex(L);
	//删除一个节点,就把他的next域赋给上一个节点的next域
	//故申请一个节点指向要删除的节点
	LNode *pdel=p->next;
	p->next=pdel->next;
	free(pdel); 
	

	 
} 

//反转链表  采用头插断尾法 
void TranVerseListLink(LinkList &L){
	LNode *r,*p,*q;
	r=L->next;
	p=q=r->next;
	r->next=NULL;
	
	while(p){
		q=q->next;
		p->next=r;
		L->next=p;
		r=p;
		p=q;
	} 
	
}

//合并链表
LNode *MergeListLink(LinkList &L,LinkList &B, LinkList &C){
 //创建指针 
 LNode *pa,*pb,*pc;
 //pa指向L的首节点
 pa=L->next;
 //pb指向B的首节点 
 pb=B->next;
 pc=C; 
 while(pa && pb){
 	if(pa->next<=pb->next){
 		pc->next=pa;
 		pa=pa->next;
	 }else{
	 	pc->next=pb;
	 	pb=pb->next;
	 }
	 pc=pc->next;
 } 
 pc->next=pa==NULL?pb:pa;
 return C;
 
	 
} 

//查找位置
LNode *getIndex(LinkList L){
	int i=0;
	int n=0;
	cout<<"请输入要查找节点的位置"<<endl;
	cin>>n;
	//判断链表插入的位置是否合法
	while(n<1||n>getLength(L)){
		cout<<"输入错误,请重新输入"<<endl;
		cin>>n; 
	} 
	//定义一个节点 来找到我们要插入的位置 
	LNode *p=L;
	for(i=0;i<n-1;i++){
		p=p->next; 
	} 
	//返回的是从0开始的第n个节点 
	return p;
	
} 
//获取链表的长度
int getLength(LinkList &L){

	LNode *m=L->next;
	int count=0;
	for(m=L->next;m!=NULL;m=m->next){
		count++; 
	}
	return count;
} 

//打印链表
void show(LinkList L){
	if(L==NULL){
		cout<<"cuwu";
	}else{
		LNode *h=L->next;
		while(h){
			cout<<h->data<<" ";
			h=h->next;
		} 

	}
	 
   

	cout<<endl;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值