数据结构(一) DLUT 链表

数据结构 DLUT 链表

普通链表

#include<iostream>
using namespace std;

typedef struct List {
	int data;
	List* next;
}Lnode,*LinkList;

void InitList(LinkList &L){
	L->next=NULL;
	L->data=0;
}//初始化链表 

void CreatListHead(LinkList &L) {
	int n;
	cout<<"输入要创建的链表节点数:"<<endl;
	cin>>n;
	L->data=n;
	Lnode *p=NULL;
	while(n--){
		p=new Lnode;
		cout<<"请输入数据:"<<endl;
		cin>>p->data;
		p->next=L->next;
		L->next=p;
	}
}//头插法

void CreatListTail(LinkList &L){
	int n;
	cout<<"输入要创建的链表节点数:"<<endl;
	cin>>n;
	L->data=n;
	Lnode *p=L->next,*q=NULL;
	while(n--){
		cout<<"请输入数据:"<<endl;
		cin>>p->data;
		q=p;
		p=new Lnode;
		q->next=p;
	}	
}//尾插法 

void TravalList(LinkList head) {
	Lnode *L = head->next;
	while (L) {
		cout << L->data << endl;
		L=L->next;
	}
	cout<<endl;
}

int ListLength(LinkList L){
	return L->data;
//	Lnode *p=&L;
//	int n=0;
//	for(;p->next!=NULL;){
//		n++;
//		p=p->next;
//	}	
//	return n;
}//链表长度 

bool ListEmpty(LinkList L){
	if(L->next==NULL){
		return true;
	}
	return false;
}//判断是否为空

void DestroyList(LinkList L){
	Lnode *p;
	while(p){
		p=L;
		L=L->next;
		delete p;
	}
}//销毁链表 

void ClearList(Lnode &L){
	Lnode *p,*q;
	p=L.next;
	while(p){
		q=p->next;
		delete p;
		p=q;
	}
	L.next=NULL;
}//清空链表

int GetData(LinkList L,int i){
	if(ListLength(L)<i||i<=0){
		cout<<"越界错误"<<endl;
		return -1;
	}
	Lnode *p=L;
	for(int j=0;j<i;j++){
		p=p->next;
	}
	return p->data;
}//获得指定位置数据(1~)

Lnode *SearchData(LinkList L,int n){
	Lnode *p=L->next;
	while(p&&p->data!=n){
		p=p->next;
	}
	if(!p){
		cout<<"未找到"<<endl;
		return NULL;
	}else{
		cout<<"已找到"<<endl; 
		return p;
	}	
}//查找数据n

int LocationData(LinkList L,int e){
	Lnode *p=L->next;
	int n=1;
	while(p&&p->data!=e){
		p=p->next;
		n++;
	}
	if(p){
		return n;
	}
	return -1;
}//查找数据返回位置序号

void ListInsert(LinkList &L,int i,int n){
	Lnode *p=L->next,*q=NULL;
	int j=0;
	while(p&&j<i-1){
		p=p->next;
		j++; 
	}
	if(j>i-1||!p){
		cout<<"越界,插入失败"<<endl;
	}else{
		q=new Lnode;
		q->data=n;
		q->next=p->next;
		p->next=q;
		L->data++;
		cout<<"插入成功"<<endl; 
	}
	
}//在第i个元素之后插入数据 

void ListDelete(LinkList &L,int i){
	Lnode *p=L,*q=NULL;
	int j=0;
	while(p&&j<i-1){
		p=p->next;
		j++;
	} 
	if(j>i-1||!p){
		cout<<"越界,插入失败"<<endl;
	}else{
		q=p->next;
		p->next=q->next;
		cout<<"第"<<i<<"个数据"<<q->data<<"删除成功"<<endl;
		delete q;		 
	}
}//删除第i个元素 

int main() {
	//请自行测试 
}

双向链表

#include<iostream>
using namespace std;

typedef struct DoubleList{
	int data;
	DoubleList *next;
	DoubleList *prior;
}Lnode,*LinkList;

Lnode* CreateDoubleList(){
	int n;
	cout<<"输入要创建的链表节点数:"<<endl;
	cin>>n;
	Lnode *p=NULL,*q=NULL; 
	LinkList L=new Lnode;
	L->data=n;
	L->next=NULL;
	L->prior=NULL;	
	p=L;
	for(int i=1;i<=n;i++){
		q=new Lnode;
		cout<<"请输入数据:"<<endl;
		cin>>q->data;
		q->next=NULL;
		q->prior=p;
		p->next=q;
		p=q;
	}
	return L;
}

void TravalDoubleList(LinkList L){
	Lnode *p=L->next; 
	while(p){
		cout<<p->data<<endl;
		p=p->next; 
	}
}

int GetDoubleLength(LinkList L){
	return L->data;
}//获取双链表长度

bool IsEmpty(LinkList L){
	return GetDoubleLength(L)==0;
}//判空 

Lnode *FindDoubleList(LinkList L,int k){
	Lnode *head=L;
	for(int i=0;i<k;i++){
		head=head->next;
	}
	return head;
}//查找第k个节点 

int GetDoubleListN(LinkList L,int n){
	int result=-1;
	Lnode *head=L;
	for(int i=0;i<GetDoubleLength(L);i++){
		head=head->next;
		if(head->data==n){
			result=i;
			break;
		}
	}
	return result;
}//寻找数值为n的节点下标 

Lnode *InsertDoubleList(LinkList &Head,int k,LinkList s){
	LinkList L=Head;
	if(k>=L->data||k<0){
		cout<<"越界插入,错误"<<endl;
		return NULL;
	}
	for(int i=1;i<=k;i++){
		L=L->next;
	}
	s->prior=L;
	s->next=L->next;
	L->next->prior=s;
	L->next=s; 
	return Head;
}//在第k个位置后添加节点 (0~)

Lnode *DelelteDoubleList(LinkList &Head,int k){
	LinkList L=Head;
	if(k>=L->data||k<0){
		cout<<"越界删除,错误"<<endl;
		return NULL;
	}
	for(int i=0;i<=k;i++){
		L=L->next;
	}
	L->prior->next=L->next;
	L->next->prior=L->prior;
	delete L;
	return Head;
}//删除第k个节点(0~) 

Lnode *ReverseDoubleList(LinkList &list){
	Lnode *head,*front,*tail,*tag;
	head=list;
	front=list->next;
	tail=front->next;
	front->next=NULL;
	while(tail){
		tag=tail->next;
		tail->next=front;
		front->prior=tail;
		front=tail;
		tail=tag;
	} 
	head->next=front;
	front->prior=head;
	return head;
}//翻转链表 

Lnode *SortDoubleList(LinkList &list){
	Lnode *head,*p,*q;
	head=list;
	p=list->next;
	while(p){
		q=p->next;
		while(q){
			if(p->data>q->data){
				p->data+=q->data;
				q->data=p->data-q->data;
				p->data-=q->data;
			}
			q=q->next;
		}
		p=p->next;
	}
	return head;
}//排序 

int main(){
	LinkList head,q=new Lnode;
	q->data=5;
	head=CreateDoubleList();
	TravalDoubleList(head);
//	cout<<endl;
//	cout<<GetDoubleLength(head)<<endl;
//	p=FindDoubleList(head,2);
//	cout<<p->data<<endl;
//	cout<<GetDoubleListN(head,2)<<endl;
	head=InsertDoubleList(head,1,q); 
	TravalDoubleList(head);
	cout<<endl;
	head=DelelteDoubleList(head,1);
	TravalDoubleList(head);
}

循环链表

#include<iostream>
using namespace std;

typedef struct CircleList{
	int data;
	CircleList *next;
}Lnode,*LinkList;

void CreateCircleList(LinkList &L){
	int n;
	cout<<"输入要创建的链表节点:"<<endl;
	cin>>n;
	L->data=n;
	Lnode *p,*q;
	p=L;
	while(n--){
		q=new Lnode;
		cout<<"输入数据:"<<endl;
		cin>>q->data;
		p->next=q;
		q->next=L->next;
		p=q;
	}
}

void TravalCircleList(LinkList L){
	Lnode *p=L->next;
	while(p->next!=L->next){
		cout<<p->data<<endl;
		p=p->next; 
	} 
}

//其余操作见List.cpp 

int main(){
	
}

初学数据结构,还望各位大佬指正,感激不尽。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

残夜.寒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值