链表

暂时没有发现bug

//.........................//
// author:bnc              //
// email:1010744256@qq.com //
//.........................//

#include<stdio.h>
#include<stdlib.h>
int ans;
class List
{
    private:struct ListNode
    {
        int data;
        ListNode *nxt;
    };
    private:struct ListHead
    {
        int ListSize;
        ListNode *nxt;
    };
    typedef struct ListHead Head;
    typedef struct ListNode Node;
    private:Head *head;
    private:void swap(int &a,int &b){int tmp=a;a=b;b=tmp;}
    public:List():head(NULL){}//初始化,把head指向为NULL
    public:void DestroyList()//摧毁表
    {
        Node *p=head->nxt,*q;
        free(head);
        while(p!=NULL)
        {
            q=p->nxt;
            free(p);
            p=q;
        }
        head=NULL;
    }
    public:void ListInit()//初始化
    {
        if(head!=NULL)DestroyList();
        head=(Head*)malloc(sizeof(Head));
        head->ListSize=0;
        head->nxt=NULL;
    }
    public:int ListSize()//表的尺寸
    {
        return head->ListSize;
    }
    public:bool ListEmpty()//表是否为空
    {
        return head->ListSize==0;
    }
    public:int FindElem(int data)//第一个位置
    {
        Node *p;
        p=head->nxt;
        int cnt=0;
        while(p!=NULL)
        {
            ++cnt;
            if(p->data==data)return cnt;
            p=p->nxt;
        }
        return -1;
    }
    public:void AddData(int data)//
    {
//        if(FindElem(data)!=-1){printf("已存在\n");return;}
        Node *p,*q;
        if(head->nxt==NULL)
        {
            p=(Node*)malloc(sizeof(Node));
            p->data=data;
            p->nxt=NULL;
            head->nxt=p;
            head->ListSize++;
        }
        else
        {
            p=head->nxt;
            while(p->nxt!=NULL)p=p->nxt;
            q=(Node*)malloc(sizeof(Node));
            q->data=data;
            q->nxt=NULL;
            p->nxt=q;
            head->ListSize++;
        }
    }
    public:void DeletByData(int data)//删除表中所有大小为data的节点
    {
        Node *p,*q;
        p=head->nxt;
        if(p->data==data)//如果第一个节点就是data,那么头节点的下一个指针要变成第二个节点的位置
        {
            head->nxt=p->nxt;
            free(p);
        }
        p=head->nxt;
        q=p;
        while(p->nxt!=NULL)
        {
            p=p->nxt;
            if(p->data==data)//如果当前这个节点是data,那么前一个节点的下一个指针就要变成当前节点的下一个节点的指针
            {
                q->nxt=p->nxt;
                free(p);
                head->ListSize--;
                p=q;
            }
            else
            {
                q=q->nxt;
                p=q;
            }
        }
    }
    public:void DeletByPos(int pos)//删除某一位置的节点
    {
        if(pos>(head->ListSize)||pos<=0)
        {
            printf("-1\n");
            return;
        } 
		Node *p,*q;
  		p=head->nxt;
        if(pos==1)
        {
        	printf("%d\n",p->data);
			head->nxt=p->nxt;
			free(p);
        }
        else
        {
        	int now=1;
	        while(now<pos)
	        {
	            q=p;
	            p=p->nxt;
	            now++;
	        }
	        printf("%d\n",p->data);
	        q->nxt=p->nxt;
	        free(p);
        }
        head->ListSize--;
    }
    public:int GetElem(int pos)//获取某一个位置的数
    {
        if(pos>(head->ListSize)||pos<=0)
        {
            return -1;
        }
        int now=1;
        Node *p;
        p=head->nxt;
        while(now<pos)
        {
            p=p->nxt;
            now++;
        }
        return p->data;
    }
    public:void PrintList()//打印表中所有数
    {
        //printf("有%d个元素\n",head->ListSize);
        ans=0;
        Node*p;
        p=head->nxt;
        int pp=1;
        while(p!=NULL)
        {
            printf("%d ",p->data);
            ans+=p->data;
            p=p->nxt;
            pp^=1;
        }
        printf("\n");
    }
    public:void Union(List &b)//把表b的元素加入到这个表中
    {
        for(int i=1;i<=b.ListSize();i++)
        {
            int data=b.GetElem(i);
            //if(FindElem(data)==-1)
			AddData(data);
        }
    }
    private:Node *ListSortMerge(Node *head1,Node *head2)//归并排序,Onlogn
    {
        if(head1==NULL)return head1;
        if(head2==NULL)return head2;
        Node *res,*p ;
        if(head1->data<head2->data)
            {res=head1;head1=head1->nxt;}
        else{res=head2;head2=head2->nxt;}
        p=res;
        while(head1!=NULL&&head2!=NULL)
        {
            if(head1->data<head2->data)
            {
                p->nxt=head1;
                head1=head1->nxt;
            }
            else
            {
                p->nxt=head2;
                head2=head2->nxt;
            }
            p=p->nxt;
        }
        if(head1!=NULL)p->nxt=head1;
        else if(head2!=NULL)p->nxt=head2;
        return res;
    }
    private:Node *Sort(Node *fir)
    {
        if(fir==NULL||fir->nxt==NULL)return fir;
        else
        {
            ListNode *fast=fir,*slow=fir;//快慢指针找到中间节点
            while(fast->nxt!=NULL&&fast->nxt->nxt!=NULL)
            {
                fast=fast->nxt->nxt;
                slow=slow->nxt;
            }
            fast=slow;
            slow=slow->nxt;
            fast->nxt=NULL;
            fast=Sort(fir);//前半段排序
            slow=Sort(slow);//后半段排序
            return ListSortMerge(fast,slow);
        }
    }
    public:void ListSort()
    {
        head->nxt=Sort(head->nxt);
    }
    public:void ListClear()
    {
        Node *p=head->nxt,*q;
        while(p!=NULL)
        {
            q=p->nxt;
            free(p);
            p=q;
        }
        head->ListSize=0;
        head->nxt=NULL;
    }
    public:void InsertData(int pos,int data)
    {
    	if(pos<=0||pos>head->ListSize+1)
    	{
	    	printf("-1\n");
	    	return;
	    }
	    Node *p=head->nxt,*q,*pp;
	    q=(Node*)malloc(sizeof(Node));
	    if(pos==1)
	    {
    		q->data=data;
    		q->nxt=p;
    		head->nxt=q;
    	}
    	else if(pos<=head->ListSize)
    	{
	    	int now=1;
	    	while(now<pos)now++,pp=p,p=p->nxt;
	    	q->data=data;
	    	q->nxt=p;
	    	pp->nxt=q;
	    }
	    else if(pos==head->ListSize+1)
	    {
    		int now=1;
    		while(now<head->ListSize)now++,p=p->nxt;
    		q->data=data;
    		q->nxt=NULL;
    		p->nxt=q;
    	}
	    head->ListSize++;
    }
    public:void ListReseve()
    {
    	if(head->ListSize==1||head->ListSize==0)return;
    	Node *p=head->nxt,*q=p->nxt,*r;
    	p->nxt=NULL;
		r=q->nxt;
    	q->nxt=p;
    	while(r!=NULL)
    	{
	    	p=q,q=r;
			r=q->nxt;
	    	q->nxt=p;
	    }
	    head->nxt=q;
    } 
};

//用法: 
int main()
{
    List L;//定义一个表 
	L.ListInit();//要初始化一下 
	L.AddData(1);//在表尾加一个数据 
	L.DestroyList();//摧毁表
	L.ListSize();//表的大小
	L.ListEmpty();//表是否为空
	L.FindElem(data);//获得第一个大小为data得位置 
	L.DeletByData(data);// 删除表中所有的大小为data的节点 
	L.DeletByPos(pos);//删除位置为pos的节点 
	L.GetElem(pos);//获得位置为pos的值 
	L.PrintList();//打印表 
	L.Union(List B);//把表B的所有的元素加入到表L中 
	L.ListSort();//排序 
	L.ListClear();//清空 
	L.InsertData(pos,data);//在位置pos加入data 
	L.ListReseve();//反转表,已更新 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值