数据结构复习单链表C语言代码实现

//带头节点 
#include<stdio.h>
#include<stdlib.h>
typedef struct code{
	int data;
	struct code *next;
	
}LNode,*LinkList;
//初始化 
bool Init(LinkList &L)
{
	L=(LNode *)malloc(sizeof(LNode));
	if(L==NULL)//内存分配失败
	    return false; 
	L->next=NULL;
	return true; 
}
//指定节点的后插操作 
bool InsertNextNode(LNode *p,int e)
   {
   	    if(p==NULL)//结点为空无法后插 
   	        return false;
   	    LNode *s=(LNode *)malloc(sizeof(LNode));
		if(s==NULL)//内存分配失败 
		    return false;
		s->data=e;
		s->next=p->next;
		p->next=s;
		return true; 
   } 
//指定节点的前插操作(未传入头指针) 
bool InsertPreNode(LNode *p,int e)
{
	if(p==NULL)
	   return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if(s==NULL)//内存分配失败 
		return false;
	s->data=p->data;
	s->next=p->next;
	p->data=e;
	p->next=s;
	return true; 
 } 
//按位序查找 
LNode *GetElem(LinkList L,int i)
{
	int j=1;
	LNode *p=L->next;
	if(i==0)
	    return L;
	if(i<1)
	    return NULL;
	while(p!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	return p;
}
//按值查找
LNode *LocateElem(LinkList L,int e)
{
	LNode *p=L->next;//头节点不存数据
	while(p!=NULL&&p->data!=e)
	{
		p->next;
	 }
	 return p;
	
}
bool IsEmpty(LinkList L)
{
	if(L->next==NULL)
	    return true;
	else
	    return false;
}
//头插法:输入12,23,34;链表显示34,23,12. 
LinkList Head(LinkList &L)
{
	LNode *s;
	int x;
	L=(LNode *)malloc(sizeof(LNode));
	L->next=NULL;
	scanf("%d",&x);
	while(x!=9999)
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next=s;
		scanf("%d",&x);
	}
	return L;
 } 
 //尾插法:插入12,34,56,输出12,34,56
 LinkList Tail(LinkList &L)
 {
 	int x;
 	L=(LNode *)malloc(sizeof(LNode));//LinkList==LNode *,一个强调链表,一个强调节点,可读性
	LNode *s,*r=L;//r为一直指向表尾的指针 
	scanf("%d",&x);
	while(x!=9999)
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x); 
	 }
	 r->next=NULL;
	 return L; 
 	
  } 
 //按位序插入
 bool Insert(LinkList &L,int i,int e)
 {
 	if(i<1)
 	   return false;
     LNode *p=GetElem(L,i-1); 
     return InsertNextNode(p,e);
  } 
  //按位序删除节点
  bool Delete(LinkList &L,int i,int &e)
  {
  	if(i<1)
  	   return false;
    LNode *p=GetElem(L,i-1);
	if(p==NULL)
	    return false;
	if(p->next==NULL)
	   return false;
	LNode *q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return true;    
   } 
   //删除指定节点(未传入头指针):偷天换日 
   bool DeleteNode(LNode *p)
   {
   	    if(p==NULL)
		   return false; 
   	    LNode *s=p->next;//p的下一个节点 
   	    if(s==NULL)//p为最后一个节点,删除失败,这种只能从表头遍历寻找p的前驱节点,需要头指针 
   	        return false;
		p->next=s->next;
		p->data=s->data;
		free(s);
		return true; 
	}
	//打印 
 void print(LinkList L)
 {
 	LNode *p;
 	p=L->next;
 	while(p!=NULL)
 	{
 		printf("%d\n",p->data);
 		p=p->next;
	 }
 }
int main()
{
	LinkList L;
	Init(L);
	//Head(L);
	Tail(L);
	Insert(L,1,45);
	print(L);
	int e=-1;
	Delete(L,2,e);//e接受删除节点的数据 
	print(L);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值