单链表的主要一些算法

归纳了单链表的一些主要算法,加深对链表的理解,更好地了解指针。

#include<iostream>
using namespace std;

typedef struct Node{     
	int data;
	struct Node *next;
}Node,*Dlink;

/*
创建单链表(有头结点)
*/
Dlink CreateDlink(){
	Node *p,*q,*head;
	head=q=(Node *)malloc(sizeof(Node));
	for(int i=0;i<6;i++){
		p=(Node *)malloc(sizeof(Node));
		p->data=i;
        q->next=p;
		q=p;
	}
	q->next=NULL;
    return head;
}
Dlink CreateDlink2(){
	Node *p,*q,*head;
	head=q=(Node *)malloc(sizeof(Node));
	for(int i=13;i<19;i++){
		p=(Node *)malloc(sizeof(Node));
		p->data=i;
        q->next=p;
		q=p;
	}
	q->next=NULL;
    return head;
}

/*
基本操作
*/


//1.插入数据到单链表

void InsertData(Dlink s,int x){
	//1.尾插法
	Node *n,*k=(Node *)malloc(sizeof(Node));
    if(!k){
		cout<<"内存不足"<<endl;
	}
	k->data=x;
    n=(Node *)malloc(sizeof(Node));
	n=s->next;
	while(n->next!=NULL){
		n=n->next;
	}
	n->next=k;
	k->next=NULL;
}

void InsertData2(Dlink s,int x){
    //2.头插法
	Node *m,*p;
	p=(Node *)malloc(sizeof(Node));
	if(!p){
		cout<<"内存不足!!!"<<endl;
	}
	p->data=x;
    m=s->next;
	p->next=m;
	s->next=p;
}
//2.删除数据
void DeleteData(Dlink s,int x){   //a.直接删除某个值的元素
	Node *p,*q,*k=s->next;
	q=(Node *)malloc(sizeof(Node));
	while(k!=NULL){
		if(k->data==x){
			q=k;
			break;
		}
		k=k->next;
	}
	if(k!=NULL){
		p=s;
		while(p->next!=q){
			p=p->next;
		}
		p->next=q->next;
		free(q);
	}
	else{
		cout<<"没有这个元素!!!!"<<endl;
	}
}

void DeleteData2(Dlink s,int i){  //b.直接删除某个位置上的元素
	Node *q,*pp=(Node *)malloc(sizeof(Node));
	pp=s;
	for(int count=0;count<i;count++){
		q=pp;
		pp=pp->next;  
	}
    q->next=pp->next;
	free(pp);
}

//3.得到特定值所在的位置
int getlocationFromData(Dlink s,int data){
	Node *h=s;
	int count=0;
    while(h->next!=NULL){
		h=h->next;
		count++;
		if(h->data==data){
			break;    
		}
	}
	if(h->data!=data){
		return -1;
	}
	return count;
}
//4.统计链表中的元素个数
int CountNum(Dlink s){
	int i=0;
	Node *node=s->next;
    while(node!=NULL){
		i++;
		node=node->next;
	}
	return i;
}

//5.排序从小到大
void SortDlink(Dlink s){
	int x;
	Node *p,*q;
	p=s;
	q=s;
	while(p->next!=NULL){
		p=p->next;
		while(q->next!=NULL){
			q=q->next;
			if(p->data<
				q->data){
				x=p->data;
				p->data=q->data;
				q->data=x;
			}
			if(q->next==NULL){
			    q=s;
				break;
			}
		}
	}
}
//6.打印
void PrintDlink(Dlink s){
    Node *p;
	p=s->next;
	while(p!=NULL){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
//7.两条单链表的合并
Dlink DlinkCombine(Dlink s1,Dlink s2){
     Node *m,*n;
	 m=s1;
	 n=s2;
     while(m->next!=NULL){
	    m=m->next;
	 }
	 m->next=n->next;
	 return s1;
}

void Menu(){
	cout<<"=============================="<<endl;
	cout<<"=====1.创建链表"<<endl;
	cout<<"=====2.统计链表结点个数"<<endl;
	cout<<"=====3.删除指定位置的结点"<<endl;
	cout<<"=====4.返回特定值的位置"<<endl;
	cout<<"=====5.头插法插入数据"<<endl;
	cout<<"=====6.尾插法插入数据"<<endl;
	cout<<"=====7.单链表的冒泡排序"<<endl;
	cout<<"=====8.删除指定值的结点"<<endl;
	cout<<"=====9.打印"<<endl;
	cout<<"=====10.两条单链表的合并"<<endl;
	cout<<"=====11.退出"<<endl;
	cout<<"=====请选择操作================"<<endl;
}


void main(){
	Dlink s;
	int k,choice,flag=1;
	s=(Dlink)malloc(sizeof(Node));
	while(flag){
		Menu();
		cin>>choice;
		switch(choice){
		case 1:
			s=CreateDlink();
			break;
		case 2:
			if(s==NULL){
				cout<<"请先创建链表!!!!!"<<endl;
				break;
			}
			cout<<"结点个数是==>"<<CountNum(s)<<endl;
			break;
	       case 3:
                        if(s==NULL){
				cout<<"请先创建链表!!!!!"<<endl;
				break;
			}
			cout<<"请输入您要删除的位置!!!"<<endl;
			cin>>k;
			if(k>CountNum(s)){
				cout<<"ERROR!!!!!"<<endl;
				break;
			}
			DeleteData2(s,k);
			break;
		case 4:
			if(s==NULL){
				cout<<"请先创建链表!!!!!"<<endl;
				break;
			}
                        cout<<"请输入要查找位置的值"<<endl;
			cin>>k;
			cout<<"它的位置是:"<<getlocationFromData(s,k)<<endl;
			break;
		case 5:
			cout<<"请输入要插入的数据"<<endl;
			cin>>k;
			InsertData2(s,k);
			break;
		case 6:
			cout<<"请输入要插入的数据"<<endl;
			cin>>k;
			InsertData(s,k);
			break;
		case 7:
			if(s==NULL){
				cout<<"请先创建链表!!!!!"<<endl;
				break;
			}
			SortDlink(s);
			break;
		case 8:
			if(s==NULL){
				cout<<"请先创建链表!!!!!"<<endl;
				break;
			}
			cout<<"请输入要删除的数据"<<endl;
			cin>>k;
			DeleteData(s,k);
			break;
		case 9:
                        PrintDlink(s);
			break;
		case 10:
			s=DlinkCombine(s,CreateDlink2());
			break;
		case 11:
			cout<<"谢谢您的测试!!!!"<<endl;
			flag=0;
			break;
		}
		
		
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值