链表(仍未完待续。。。。)

时间:2022-11-20 00:25:50

链表,自己看的,本来想第一个节点处没元素,最后一个节点处差不多跟网上其他人的链表差不多,但是发现不能理解,然后就自己瞎写....竟然还写出了一个奇怪的类似于链表一样的东西....还没写完,近期更新,目前仅供自己查看...

现在完善一点了,然后再看看链表的实现,再完善一下功能,离400来行还差一百来行啊!

挖坟*2.。。还是没完。。。十个功能了

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h> 

//#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

#define ll long long
#define da    0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件

struct node{
	int data;					//数据域 
	node *next;					//指针域 
};

void createlinked(node *head)
{
	//head=(node*)malloc(sizeof(node));//为head申请一个node大小的空间
	int data;
	cin>>data;					//输入数据 
	head->data=data; 			//头指针有内容
	head->next=NULL;			//开始只有它自己 
	cin>>data;
	node *can;					//定义下一个节点 
	can=(node *)malloc(sizeof(node));//为下一个节点开辟空间 
	if(data>0)
		head->next=can;			//第二个数据有意义,第一个节点指向第二个节点 
	while(data>0)				//按要求给数据,现在有意义的数据范围时data>0 
	{
		can->data=data;			//该节点赋值 
		cin>>data;				//输入下一个节点的值 
		if(data>0)			//符合要求 
		{
			node *next;			//定义一个新节点并且指向它 
			next=(node*)malloc(sizeof(node));
			can->next=next;
			can=next;			//使该节点等于下一个节点 
		}
		else
			can->next=NULL;	//下一个无意义,该节点为最后一个节点,指向空 
	}
}

void outputlinked(node *head)
{
	cout<<head->data<<" ";		//首先输出头结点的数据 
	if(head->next==NULL)
		return ;
	node *next;
	next=(node*)malloc(sizeof(node));
	next=head->next;			//找到下一个节点 
	while(1)
	{
		if(next->next==NULL)	//如果这个节点就是最后一个节点了 
		{
			cout<<next->data<<endl;	//输出对应的数据 
			break;				//结束该任务 
		}
		else
		{
			cout<<next->data<<" ";//输出对应数据 
			next=next->next;		//找到下一个节点 
		}
	}
}

int lenthlinked(node *head)
{
	int len=1;						//我用的这个链表head中是必定有元素的,所以初始长度为1 
	if(head->next==NULL)
		return 1;					//如果只有一个有意义的数返回1长度 
	node *can;
	can=(node*)malloc(sizeof(node));
	can=head->next;					//从第二个开始找 
	while(1)
	{
		len++;						//下一个必定有意义,len++; 
		if(can->next==NULL)			//该节点为最后一个节点了,返回长度 
			return len;
		else
			can=can->next;			//继续循环 
	}
}

int findlinked(node *head,int key)
{
	int place=1;					//目前的位置为1 
	if(head->data==key)				//返回这个位置 
		return place;
	if(head->next==NULL)			//只有一个元素,且不包含目标元素 
		return 0;					//返回0; 
	node *can;
	can=(node*)malloc(sizeof(node));
	can=head->next;					//下一个节点开始找 
	while(1)
	{
		place++;					//位置++; 
		if(can->data==key)
			return place;			//找到了返回该位置 
		if(can->next==NULL)
			return 0;				//这是最后一个节点了,且没找到返回0 
		can=can->next;				//继续寻找下一个节点 
	}
}

void replacelinked(node *head,int old,int now)
{
	node *can;
	can=(node*)malloc(sizeof(node));
	can=head;
	while(1)
	{
		if(can->data==old)			//找到这个节点 
		{
			can->data=now;
			return ;
		}
		can=can->next;				//每找到继续 
	}
}

void removelinked(node *head,int key)
{
	if(head->data==key)				//要删除的是第一个元素 
	{
		if(head->next!=NULL)		//该链表不只有一个节点 
		{
			node *can;
			can=head; 
			head=head->next;		//删除该节点 
			free(can);				//将首节点释放 
			return ;
		}
		else
		{
			cout<<"删除完毕,当前链表为空!"<<endl;
			free(head);				//释放该链表 
			return ;
		}
	}
	node *can,*now;//,*next
	now=(node*)malloc(sizeof(node));
	//next=(node*)malloc(sizeof(node));
	can=(node*)malloc(sizeof(node));
	now=head;
	can=head->next;
	//next=can->next;
	while(1)
	{
		if(can->data==key)			//找到该节点 
		{
			if(can->next==NULL)		//该节点是尾节点 
			{
				now->next=NULL;		//该节点的前驱节点为空 
				free(can);			//释放该节点 
				break;
			}
			now->next=can->next;	//不是尾节点,前驱结点指向该节点的后继节点 
			free(can);
			break;
		}
		now=can;					//记录前驱结点 
		can=can->next;				//向后移动一位 
	}
}

void insertlinked(node *head,int target,int place,int len)
{
	int i,j;
	node *now;
	now=head;
	for(i=1;i<place;++i)			//从第一个节点一直到要插入节点的后一个节点 
		now=now->next;
	node *can;
	can=(node *)malloc(sizeof(node));
	if(now->next==NULL)
	{
		now->next=can;
		can->next=NULL;
		can->data=target;
		return ;
	}
	can->data=target;
	can->next=now->next;
	now->next=can;
}

node* reverselinked(node *head)
{
	if(head->next==NULL)
		return head;
	node *pre,*cur,*ne;
	pre=head;
	cur=head->next;
	while(cur)
	{
		ne=cur->next;
		cur->next=pre;
		pre=cur;
		cur=ne;
	}
	cout<<head<<endl;
	head->next=NULL;
	head=pre;
	cout<<head<<endl;
	return head;
	
}

void emptylinked(node *head)
{
	node *can,*now;
	now=(node*)malloc(sizeof(node));
	can=(node*)malloc(sizeof(node));
	can=head;
	while(1)
	{
		cout<<1<<" ";
		now=can;
		if(can->next==NULL)
		{
			free(now);
			return ; 
		}
		can=can->next;
		free(now);
	}
}
/*
10 9 8 7 6 5 4 -1
4
4 5
5
4 6
*/
int main()
{
	//1,有一个表头 
	node head;//表头指向空 (此时其中的元素为0)
	//2。创建一个链表
	cout<<"创建一个链表"<<endl;
	createlinked(&head);//创建一个链表,将表头所在的地址传过去 
	//3.查看链表是否创建成功(看一下里面的数据) 
	cout<<"输出该链表"<<endl;
	outputlinked(&head);//输出该链表中的所以元素 
	//4.求链表的长度 
	cout<<"求链表长度"<<endl;
	int len;
	len=lenthlinked(&head);//求长度
	cout<<"该链表长度为:"<<len<<endl;
	//5.在链表中查找一个值 
	cout<<"查找链表中的一个值"<<endl;
	int target,place=0;
	cin>>target;
	place=findlinked(&head,target);	//查找链表 
	if(place)
		cout<<"find! it place is "<<place<<endl;
	else
		cout<<"nofind!"<<endl;
	//6。替换链表中的某值
	cout<<"替换链表中的一个值"<<endl;
	int old,now;
	cin>>old>>now;					//老数替换成新数 
	replacelinked(&head,old,now);	//替换链表 (必须保证该链表中有被替换的元素)
	outputlinked(&head);			//输出该链表看看是否替换过了; 
	//7.删除元素; 
	cout<<"删除链表中的一个值"<<endl;
	cin>>target;					//输入要删除的目标 
	removelinked(&head,target);		//删除链表(该链表中必须有要删除的元素) 
	outputlinked(&head);			//输出对应的列表查看是否删除 
	len=lenthlinked(&head);			//刷新长度 
	cout<<"now,the lenth of this linked is :"<<len<<endl; 
	//8.插入新节点;
	cout<<"插入一个x在第y个数的后面(从01开始)"<<endl;
	cin>>target>>place;
	insertlinked(&head,target,place,len);//当前采用的方法是place后插入 
	outputlinked(&head);			//查看是否插入成功 
	//9.反转链表 
	cout<<"反转链表"<<endl;
	cout<<&head<<endl;
	node *temphead=NULL;
	temphead=reverselinked(&head);	//以后的头指针就变成temphead了。。心累。。 
	cout<<&temphead<<endl;
	outputlinked(temphead);
	//10.清空链表
	cout<<"清空链表"<<endl; 
	emptylinked(&head);
	
}

还是太菜了。。。等等在学点东西继续改吧。。。。


目前运行的结果是这样的:

链表(仍未完待续。。。。)