数据结构基础代码02单链表

#include<iostream>
#include<stdlib.h>
using namespace std;

#define Maxsize 50
typedef int ElemType;

//单链表定义
typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
}LinkNode,*LinkList; 

//等同于下面的
//struct LinkNode{
//	ElemType data;
//	struct LNode *next;
//}; 
//
//typedef struct LinkNode Linknode;//重命名,把 struct LinkNodeg换成Linknode
//typedef struct LinkNode *LinkList;//表示Linklist是指向 LinkNode的指针 
//初始化一个单链表(带头结点)
bool InitList(LinkList &L)
{
	L= (LinkNode*)malloc(sizeof(LinkNode));
	if(NULL == L)
		return false;
	L->next = NULL;//防止脏数据 
	return true;
	
} 
//头插法建立单链表
LinkList Insert_head(LinkList &L)
{
	LinkNode *s;//LNode *s等同于 LinkList L 
	int x;
	L=(LinkList)malloc(sizeof(LinkNode));//创建头节点
	L->next = NULL;//初始为空链表 
	scanf("%d",&x);//输入节点的值 
	while(x!=Maxsize)//输入50表示结束 
	{
		s = (LinkNode*)malloc(sizeof(LinkNode));//创建新节点 
		s->data = x;
		s->next = L->next;
		L->next = s;//将新节点插入表中,L为头指针 
		scanf("%d",&x);
	}
	return L;
} 

头插法效果 

 

 

//尾插法建立单链表
LinkList Insert_tail(LinkList &L)
{
	LinkNode *s,*r;
	int x;//与 ElemType一致 
	L = (LinkList)malloc(sizeof(LinkNode));//建立头节点 
	r = L;//r为表尾指针 
	scanf("%d",&x);//输入节点的值 
	while(x!=Maxsize)//输入50表示结束 
	{
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = x;
		r->next = s;
		r = s;//r指向新的表尾 ,r在移动  
		scanf("%d",&x);
	}
	r->next = NULL;//尾节点指针置空 
	return L;
}

尾插法效果 

 

//按序号查找节点
LinkNode* Findvalue(LinkList L,int i)
{
	int j = 1;
	LinkNode* p = L->next;
	if(i==0)return L;
	if(i<1)return NULL;
	while(p&&j<i)
	{
		p = p->next;
		j++;
	}
	return p;
}

 按序号查找效果

//按值查找
LinkNode* Getvalue(LinkList L,ElemType e)
{
	LinkNode* p = L->next;
	while(e!=p->data)
	{
		p = p->next;
	}
	return p;
}

按值查找效果 

 

void Insertvalue(LinkList &L,int i,ElemType e)
{
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = e;
	int j = 1;
	LinkNode* p = L->next;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	s->next = p->next;
	p->next = s;
	
}

插入值效果 

 

//删除第i个节点
void DeleteNode(LinkList &L,int i)
{
	int j=1;
	LinkNode *p=L->next;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	LinkNode* s=p->next;
	p->next=s->next;
	free(s);
	return ;
}

删除结点效果 

 

 

int main()
{
	LinkList hahaha;
	InitList(hahaha);
	//Insert_head(hahaha);
	Insert_tail(hahaha);
	
	//LinkNode* p = hahaha->next;指向第一个节点 
	LinkNode* p = hahaha->next;
	while(p!=NULL)
	{
		cout<<p->data<<endl;
		p = p->next;
	}
	//DeleteNode(hahaha,2);
	//Insertvalue(hahaha,2,5);
	//cout<<Findvalue(hahaha,3)->data;
	//cout<<Findvalue(hahaha,3);
	p = hahaha->next;
	while(p!=NULL)
	{
		cout<<p->data<<endl;
		p = p->next;
	}
	return 0;
} 

main函数,验证效果时将注释那几句挑出来运行 

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值