链表的创建与基本操作(C++ 实现)

链表即采用链式存储方式的线性表。为了表示每个数据元素 a_i 及其后继元素 a_{i+1} 间的逻辑关系,我们在存储数据元素 a_i 的同时,必须存储一个指示其后继 a_{i+1}的存储位置的信息 b_i 。我们称这样的二元组 (a_i, b_i)为一个结点 ( Node ) 。不多说,直接贴代码吧。

 

#include 
#include 
#include 
using namespace std;
struct Node
{
	int data;
	Node *next;
};

class List
{
	
public:
	 Node *head;
	 List()//构造函数初始化一个空链表
	  {
		  head=NULL;
	  }

	 void Create()//创建一个链表
	 {
		Node *p=new Node;
		p->data = 0;
		p->next = NULL;
		head=p;
		int n;
Start:
		cout<<"请输入链表的长度: "<>n;

		if(n<0)
		{
			cout<<"您的输入有误,请从新输入!"<>p->data;

		for(int i = 1; i < n; i++)
		{
			Node *q=new Node;
			q->next = NULL;
			cout<<"请输入第 "<>q->data;
			//q->next=p->next;
			p->next=q;
			p=q;
			
		}
	 }

	 ~List()//析构函数释放内存
	 {
		 Node *p;
		 cout<<"链表已销毁"<next;
			delete [] head;
			head=p;
		}
	 }

	 void Destroy()//销毁链表
	 {
		 Node *p;
		 cout<<"链表已销毁"<next;
			delete [] head;
			head=p;
		}
	 }



	 void Clear()//清空链表,保留第一个结点head,并设其数据域为0,如有需要可以继续添加新结点
	 {
		 Node *p,*q;
		 if(head == NULL)
		 {
			cout<<"这已经是一个空链表"<next;
		 while(p!=NULL)
		 {
			 q=p->next;
			 delete [] p;
			 p=q;
		 }
		 head->next=NULL;
		 head->data=0;
	 }

	 List *TailInsert(int m)//在表的尾端添加数值m
	 {
		 Node *p=head;
		 while(p->next != NULL)
		 {
			 p=p->next;
		 }
		 Node *q=new Node;
		 q->data=m;
		 q->next=NULL;
		 p->next=q;
		 List *A=new List;
		 A->head=this->head;
		 
		 return A;
	 }

	 void TailInsertMore(int a[],int m)//在尾段依次添加m个元素的数组,也可以看做一种建表的方法
	 {
		 
		 for(int j=0;jhead=(this->TailInsert(a[j]))->head;
		 }
	 }
	 
	 void Insert(int i,int m)//在表的第i个位置插入一个数m
	 {
		 Node *p=head;
		 int j=1;
		 while(p && jnext;
			 j++;
		 }
		 if(!p || j>i-1)
		 {
			  cout<<"插入位置有误"<data=m;
			 q->next=p->next;
			 p->next=q;

		 }
	 }

	 void Delete(int i)//删除表的第i个元素,返回其值m
	 {
		 int m;
		 Node *p=head;
		 int j=1;
		 while(p->next && jnext;
			 j++;
		 }
		 if(!(p->next)||j>i-1)
			 cout<<"删除位置错误"<next;
			 p->next=q->next;
			 m=q->data;
			 delete q;
		 }
		 cout<<"被删除的 "<data<<", 存储的指针是 "<next<<"."<next;
			
		}
	 }
	 int Length()//链表长度
	 {
		 Node *p=head;
		 int j=0;
		 while(p!=NULL)
		 {
			 p=p->next;
			 j++;
		 }
		 cout<<"链表长度为 "< next,*node;     //从头结点开始遍历
            head -> next = NULL;
            while(current != NULL)
			{
                node = current -> next;    //记住当前操作节点的后面节点的地址
                current -> next = head;
                head = current;
                current = node;
            }
	 }


	 void Sort()//利用冒泡排序从大到小排列
	 {
		 Node *s=head;
		 while(s->next!=NULL)
		 {

		 Node *p=s; 
		 Node *q=p->next;
		 while(q!=NULL)
		 {
			 if(p->data<=q->data)
			 {
				 p=q;
				 q=q->next;
			 }
			 else
			 {
				 Node *r=new Node;
				 int m=p->data;
				 r=p;
				 r->data=q->data;
				 p=q;
				 p->data=m;
				 q=p->next;

			 }
		 }
		 int l=s->data;
		 s->data=p->data;
		 p->data=l;
		 s=s->next;
		 }


	 }

	 void Delete_Repeat()//删除链表中重复出现的元素,只保留第一个出现的元素,并输出各出现几次
	 {
		 Node *p = head;
		 if(p == NULL)
			 cout<<"链表为空.";
		 if(p->next == NULL)
			 cout<<"链表只有一个元素.";
		 
		while(p->next != NULL)
		{
			Node *q=p;
			while(q->next!=NULL)
			{
				if(p->data == q->next->data)
				{
					while(p->data == q->next->data && q->next->next != NULL)
					{
						q->next=q->next->next;

					}
					q=q->next;
				}
				else
				{
					
					q = q->next;
				}
			}
		p=p->next;
		}

		Node *r=head,*s=head;
		while(r->next != NULL)
		{
			r=r->next;
		}

		int i=0;

		while(s->next->next != NULL)
		{
			if(s->data == r->data)
			{
				i++;
			}
			s=s->next;
		}
		if(i>0)
		{
			s->next = NULL;
		}

	 }

	 void Get()//获取链表指定位置的元素值
	 {
		 cout<<"请输入需要查找的位置:"<>k;
		 Node *p=head;
		 int l=1;
		 while(p!=NULL && lnext;
			 l++;
		 }
		 if(p==NULL || ldata;
			 cout<<"第 "<>k;
		 Node *p=head;
		 int j=0,i=0;
		 while(p!=NULL)
		 {
			 i++;
			 if(p->data==k)
			 {
				j++;
				p=p->next;
				cout<<"值 "<next;
			 }
		 }
		 cout<<"值 "<next!=NULL)
	{
		c=c->next;
	}
	c->next=b;
	return C;
}

int main()
{
	cout<<"*****链表初始化*****"<Output();              //插入一个数
	cout<

 

你可能感兴趣的:(链表的创建与基本操作(C++ 实现))