• 一个简单的链表结构 分类: C/C++ 数据结构与算法 2015-06-14 16:39 129人阅读 评论(1) 收藏


             仅仅实现了基本的链表操作,如创建、查找、删除、排序等。

    //头文件
    /*there is no head node exist
     *
     */
    #include <iostream>
    
    using namespace std;
    
    typedef struct Node{
    	int value;
    	struct Node* next;
    }Node,*ListNode;
    
    
    bool isEmpty(ListNode );//judge the list status
    bool createList(ListNode* ,const int=10);//create new list
    bool printList(ListNode ,ostream& output=cout);//print the list
    int size(ListNode);
    bool insert(ListNode* ,int ,int);
    //insert in the last
    bool insertTail(ListNode* ,int );
    
    bool find(ListNode ,int ,int& );//find a node in list
    bool deleteNode(ListNode* ,int ,int& );
    bool deleteNode(ListNode* ,int ,bool flag=true);
    bool getData(ListNode ,int ,int& );
    bool deleteList(ListNode* );//delete the list entire
    
    ListNode sort(ListNode );//sort,and return a new list
    int fmin(ListNode );
    int fmax(ListNode );
    

    //源文件
    #include <time.h>
    #include "List.h"
    #include <stdlib.h>
    
    bool isEmpty(ListNode pHead)
    {
    	if(!pHead)
    		return true;
    	return false;
    }
    
    bool createList(ListNode* pHead,const int N)
    {
    	if(N<0)
    		return false;
    	if(N==0)
    		return true;		
    	static size_t randSeed=100;
    	ListNode p1=new Node();
    	if(!p1)//apply for memory failed
    		return false;
    	srand(time(0)+randSeed);
    	p1->value=rand()%100+1;
    	*pHead=p1;
    	for(int i=0;i<N-1;++i)
    	{
    		srand(time(0)+randSeed);
    		ListNode pNew=new Node();
    		if(!pNew)
    		{
    			p1->next=NULL;
    			return false;
    		}
    		pNew->value=rand()%100+1;
    		p1->next=pNew;
    		p1=pNew;
    		randSeed+=rand();
    	}
    	p1->next=NULL;//the last node pointer to NULL
    	return true;
    }
    
    bool printList(ListNode pHead,ostream& output)
    {
    	if(!pHead)
    		return false;
    	ListNode p=pHead;
    	while(p)
    	{
    		output<<p->value<<"   ";
    		p=p->next;
    	}
    	return true;	
    }
    
    int size(ListNode pHead)
    {
    	ListNode p=pHead;
    	int length(0);
    	while(p)
    	{
    		length++;
    		p=p->next;		
    	}
    	return length;
    }
    
    bool insert(ListNode* pHead,int pos,int data)
    {//insert before the pos node
    	if(pHead==NULL)
    		return false;
    	ListNode p,k;
    	k=p=*pHead;
    	int j=1;
    	//pos should more than 0
    	while(p && j<pos)
    	{
    		k=p;
    		p=p->next;
    		++j;
    	}
    	//if the list is empty,insert will be refused
    	if(!p || j>pos)//if pos<1,return;
    		return false;
    	ListNode q;
    	q=new Node();
    	q->value=data;
    	q->next=p;
    	if(k==p)//在第一个节点前插入
    	{
    		*pHead=q;
    	}
    	else
    		k->next=q;
    	return true;
    }
    
    bool insertTail(ListNode* pHead,int data)
    {
    	if(pHead==NULL)
    		return false;
    	ListNode p=*pHead;
    	if(!p)
    	{
    		ListNode q=new Node();
    		q->value=data;
    		q->next=NULL;
    		*pHead=q;
    		return true;
    	}
    	while(p->next)
    	{
    		p=p->next;
    	}
    	ListNode q=new Node();
    	q->value=data;
    	q->next=NULL;
    	p->next=q;
    	
    	return true;
    }
    
    bool deleteNode(ListNode* pHead,int pos,int& value)
    {
    	if(pHead==NULL || *pHead==NULL)
    		return false;
    	ListNode p,q;
    	p=q=*pHead;
    	int j=1;
    	while(p && j<pos)
    	{
    		q=p;
    		p=p->next;
    		j++;
    	}
    	if(!p || j>pos)
    		return false;
    	if(p==q)
    	{
    		value=p->value;
    		*pHead=p->next;
    		delete p;
    		p=NULL;
    		return true;
    	}
    	else
    	{
    		value=p->value;
    		q->next=p->next;
    		delete p;
    		p=NULL;
    		return true;
    	}
    }
    
    //delete the node where value=data
    //if flag=true,delete all node where value=data,or delete the first one
    bool deleteNode(ListNode* pHead,int data,bool flag)
    {
    	if(pHead==NULL || *pHead==NULL)
    		return false;
    	ListNode p,q;
    	p=q=*pHead;
    	if(flag)
    	{
    		while(p)
    		{
    			if(p->value==data)
    			{
    				if(p==q)
    				{
    					*pHead=p->next;
    					delete p;
    					p=q=*pHead;
    				}
    				else
    				{
    					q->next=p->next;
    					delete p;
    					p=q->next;
    				}
    			}
    			q=p;
    			p=p->next;		
    		}
    	}
    	else
    	{
    		while(p && p->value!=data)
    		{
    			q=p;
    			p=p->next;
    		}
    		if(!p)
    			return false;
    		if(p==q)
    		{
    			*pHead=p->next;
    			delete p;
    			p=NULL;
    		}
    		else
    		{
    			q->next=p->next;
    			delete p;
    			p=NULL;
    		}
    	}
    	return true;
    }
    
    //find data in list,pos is the position in list
    bool find(ListNode pHead,int data,int& pos)
    {
    	ListNode p=pHead;
    	pos=0;
    	while(p)
    	{
    		pos++;
    		if(p->value==data)
    		{
    			return true;
    		}
    		p=p->next;
    	}
    	return false;
    }
    
    //read the value in k node
    bool getData(ListNode pHead,int k,int& data)
    {
    	if(pHead==NULL)
    		return false;
    	if(k<=0 || k>size(pHead))
    		return false;
    	int i=1;
    	ListNode p=pHead;
    	while(p && i<k)
    	{
    		i++;
    		p=p->next;
    	}
    	if(!p)
    		return false;
    	data=p->value;
    	return true;
    }
    
    bool deleteList(ListNode* pHead)
    {
    	if(pHead==NULL)
    		return false;
    	ListNode p=*pHead;
    	while(p)
    	{
    		ListNode q=p->next;
    		delete p;
    		p=q;		
    	}
    	*pHead=NULL;
    	return true;
    }
    
    //select sort
    ListNode sort(ListNode pHead)
    {
    	ListNode pHeadNew;
    	pHeadNew=NULL;
    	if(!pHead)
    		return pHeadNew;
    	while(pHead)
    	{
    		int min=fmin(pHead);
    		deleteNode(&pHead,min,false);
    		insertTail(&pHeadNew,min);
    	}
    	return pHeadNew;
    }
    
    int fmax(ListNode pHead)
    {
    	int max=0x80000000;
    	ListNode p=pHead;
    	while(p)
    	{
    		if(p->value > max)
    		{
    			max=p->value;
    		}
    		p=p->next;
    	}
    	return max;	
    }
    
    int fmin(ListNode pHead)
    {
    	int min=0x7FFFFFFF;
    	ListNode p=pHead;
    	while(p)
    	{
    		if(p->value < min)
    		{
    			min=p->value;
    		}
    		p=p->next;
    	}
    	return min;	
    }
    

    //测试程序
    #include <iostream>
    #include "List.h"
    
    using namespace std;
    
    const int N=10;
    
    int main()
    {
    	ListNode pHead;
    	pHead=NULL;
    	if(!createList(&pHead,N))
    		cout<<"create list failed!"<<endl;
    	cout<<"The initial length:"<<size(pHead)<<endl;
    	
    	cout<<endl<<"print list:"<<endl;
    	if(!isEmpty(pHead))
    		printList(pHead);
    
    	insert(&pHead,1,45);
    	insert(&pHead,3,30);
    	cout<<endl<<"print list:"<<endl;
    	if(!isEmpty(pHead))
    		printList(pHead);
    	
    	insertTail(&pHead,18);
    	cout<<endl<<"print list:"<<endl;
    	if(!isEmpty(pHead))
    		printList(pHead);
    	
    	int valueToBeDeleted;
    	deleteNode(&pHead,1,valueToBeDeleted);
    	cout<<endl<<"print list:"<<endl;
    	if(!isEmpty(pHead))
    		printList(pHead);
    	
    	valueToBeDeleted=2;
    	deleteNode(&pHead,valueToBeDeleted);
    	cout<<endl<<"print list:"<<endl;
    	if(!isEmpty(pHead))
    		printList(pHead);
    	
    	int value;
    	cout<<endl<<"find result:"<<find(pHead,18,value)<<endl;
    	cout<<"position:"<<value<<endl;
    	
    	cout<<"read data:"<<getData(pHead,11,value)<<endl;
    	cout<<"data:"<<value<<endl;
    	
    	cout<<"min:"<<fmin(pHead)<<endl;
    	
    	ListNode newList=sort(pHead);
    	if(!isEmpty(newList))
    		printList(newList);
    	else
    		cout<<"list is empty..."<<endl;
    	
    	deleteList(&pHead);
    	if(!isEmpty(pHead))
    		printList(pHead);
    	else
    		cout<<endl<<"list is empty..."<<endl;	
    	return 0;
    }


  • 相关阅读:
    [九、完整项目]3完成首页顶部内容的制作
    [九、完整项目]10完成课程列表视图的制作
    [九、完整项目]7将四个功能模块合并成首页
    [九、完整项目]4完成首页课程类别列表的制作
    [九、完整项目]8完成课程类型和课程列表类型的定义
    [九、完整项目]2集中存放应用程序所有视图通用的修饰符
    [九、完整项目]6完成首页热门主题列表的制作
    [九、完整项目]9完成历史课程列表的制作
    [九、完整项目]1使用Swift UI技术搭建教程合集的界面
    [九、完整项目]5完成首页课程班级列表的制作
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687119.html
Copyright © 2020-2023  润新知