链表实现

25 篇文章 0 订阅
/*
指针知识复习: 
int *p = new int; //此时指针p指向一个int对象,该对象没有被初始化 

int *p = new int(0); //指针p指向一个int对象,该对象被初始化为0
int *p = new int[10]; //指针p指向一个int型数组,该数组未被初始化
int *p = new int[10](0); //指针p指向一个int型数组,该数组的元素都被初始化为0

new就是在程序的堆区申请一个没有命名的空间,你可以把new看成是一个系统内置的函数,该函数返回一个指向没有命名的空间地址(也就是指针).
另外,对于new申请的空间,程序员必须显示的删除该内存空间,用delete删除,比如这样,delete p,和delete[] p,前者是删除单个对象,后者是删除一个数组
*/

#include <iostream>
using namespace std;

class linkNode		//这里创建一个结构体用来表示链表的节点类型 
{
	public:
		int data;
		linkNode *next;
};

int main()
{
	//=================================================初始化================================================================
	 
	int n,i,num;
	linkNode *head;		//定义一个头指针
	linkNode *currentPoint;	//定义一个指向节点的指针,这个是一个指向【当前节点】的指针 
	linkNode *lastPoint;	//定义一个指向节点的指针,不过这个 指向【上一个节点】的指针 
	
	cin>>n;
	
	head = NULL;		//一开始头指针为空,意思是这个链表还没有东西	
	
	//=================================================把 n 个数存入链表中================================================================
	for (i=0;i<n;i++)
	{
		cin>>num;
		currentPoint = new linkNode;	//创建一个新节点。指针point 指向一个 【linkNode类型的对象】(节点) 
		currentPoint->data = num;		//把数据存入新节点的 data 域中 
		currentPoint->next = NULL;		//设置当前节点的后继指针为空,也就是当前节点的下一个节点为空
		if (head == NULL)
			head = currentPoint;	//如果这是第一个创建的节点,则将头指针指向这个节点
		else
			lastPoint->next = currentPoint;	//如果这不是第一个创建的节点,则将上一个节点的的后继指针指向当前节点 
			
		lastPoint = currentPoint;	//指针lastPoint 也指向当前节点 
	}
	currentPoint->next = NULL;		//将最后一个节点的后继指针设为NULL,标明这是一个尾节点 
	
	
/*	
	//=================================================插入节点================================================================
	int x;			//需要插入的数
	int no = 0;		//需要插入在第 no 个节点之后
	int tmp = 0;	//用于计数 
	linkNode *t = head;	//用来遍历节点的指针
	
	cin>>x>>no;
	
	if (no==0)				//如果要插入在第一个节点
	{
		currentPoint = new linkNode;
		currentPoint->data = x;
		currentPoint->next = head;
		head = currentPoint;
	} 
	else 					//如果要插入在中间 或者 最后一个节点
	{
		while(t!=NULL)
		{
			tmp++;
			if (tmp==no || t->next==NULL)	 
			{
				currentPoint = new linkNode;
				currentPoint->data = x;
				currentPoint->next = t->next;
				t->next = currentPoint;
				break;	//插入完成后即退出循环 
			}
			t = t->next; //***遍历下一个节点 
		}
	}
	
*/	
	
	//=================================================删除节点================================================================
	int y;			//要删除第 y 个节点
	int tmp1 = 0;	//用来计数 
	linkNode *del;	//创建一个指向要删除的节点的指针 
	linkNode *t = head;		//遍历用的指针 
	
	cin>>y;
	
	if (y==1) 		//如果要删除第 1 个节点 
	{
		del = head;
		head = del->next;
		delete del;
	} 
	else 			//如果是要删除后面的节点 
	{
		while (t!=NULL)
		{
			tmp1++;
			if (t->next==NULL)
				cout<<"你要删除的节点是一个空节点,请重新输入一个新的节点"<<endl;
			else if (tmp1==y-1)
			{
				del = t->next;
				t->next = del->next;
				delete del;
				break;
			}
			t = t->next;	//***遍历下一个指针 
		}
	}
	
	//=================================================输入链表中的内容================================================================
	t = head;		//定义一个指向【头节点】的指针,用来遍历 
	while (t!=NULL)
	{
		cout<<t->data<<' ';
		t = t->next;	//指向下一个节点 
	} 
	
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值