数据结构中对单链表的操作

#include <iostream>
using namespace std;
typedef struct LNode   //定义单链表
{
  int data;
  struct LNode *next;//为了指向后继节点
} LinkNode;

//线性表的初始化
void  InitList(LinkNode *&L)
{
	L=(LinkNode*)malloc(sizeof(LinkNode));
	L->next=NULL;
}
//销毁线性表
void DestoryList(LinkNode *&L)
{
  LinkNode *pre=L,*p=L->next ;
  while(p!=NULL)
  {
    free(pre);
	pre=p;
	p=p->next ;
  }
  free(pre);
}
//判断线性表是否为空
bool EmptyList(LinkNode *L)  
{
 return (L->next ==NULL);
}
//求线性表的长度
int Listlength (LinkNode *&L)
{
 int length=0;
 //L=(ListNode*)malloc(sizeof(LinkNode));
 LinkNode *s=L;
 while(s->next !=NULL)
	{ 
	 length++;
     s=s->next ;
 }
return length;
}
//输出线性表
void DispList(LinkNode *L)
{
LinkNode *s=L->next;
while(s !=NULL)
{
 cout<<s->data<<"->" ;
 s=s->next ;
}
}
//求某个元素在单链表中的位置 ,因为如果这个元素不在链表中,就要返回假,所以用bool类型
bool  GetElem(LinkNode *L,int i,int &e)
{
	int j=0;
 LinkNode *s=L;
 while(j<i&&s!=NULL) //如果s=NULL说明没有元素了  而且如果用s->next 作为条件的话,那么到达最后一个元素的时候并不会判断,因为下一个元素为空直接跳出循环
 {
  j++;
  s=s->next;
 }
 if(s==NULL)
	 return false;
 else
 {
   e=s->data;
   return true;
 }
}
//头插法  倒序插入
void CreateListF(LinkNode *&L,int a[],int n)
{
	LinkNode *s;
	int i;
	L=(LinkNode*)malloc(sizeof(LinkNode));
    L->next=NULL;
	for(i=0;i<n;i++)
	{
	 s=(LinkNode*)malloc(sizeof(LinkNode));
	 s->data=a[i];
	 s->next =L->next ; //s指向L的next
	 L->next =s;
	}
}
//尾插法 正序插入
void CreateListR(LinkNode *&L,int a[],int n)
{
 LinkNode *r,*s;
 int i;
 L=(LinkNode*)malloc(sizeof(LinkNode));
 r=L;//r始终指向尾结点
for(i=0;i<n;i++)
{
  s=(LinkNode*)malloc(sizeof(LinkNode));
  s->data=a[i];
  r->next=s;
  r=s;
}
r->next =NULL;
}  
//插入数据元素
 bool ListInsert(LinkNode *&L,int i,int e)
{  int j=0;
   LinkNode *p=L,*s;     

   while (j<i-1 && p!=NULL)
   {	j++;
	p=p->next;
   }
   if (p==NULL)	//未找到第i-1个结点,返回false
       return false;
   else			//找到第i-1个结点p,插入新结点并返回true
   {
	s=(LinkNode *)malloc(sizeof(LinkNode));
	s->data=e;		//创建新结点s,其data域置为e
	s->next=p->next;	//将s插入到p之后
	p->next=s;
	return true;
   }
}
//删除某个数据元素
 bool ListDelete(LinkNode *&L,int i,int &e)
{  int j=0;
   LinkNode *p=L,*q;	//p指向头结点,j置为0

   while (j<i-1 && p!=NULL)	//查找第i-1个结点
   {	j++;
	p=p->next;
   }
 if (p==NULL)		//未找到第i-1个结点,返回false
	return false;
   else				//找到第i-1个结点p
   {	q=p->next;		//q指向第i个结点
	if (q==NULL)		//若不存在第i个结点,返回false
	       return false;
	e=q->data;
	p->next=q->next;	//从单链表中删除q结点
	free(q);		//释放q结点
	return true;		//返回true表示成功删除第i个结点
   }
}


int main()
{
 LinkNode *L;
 int a[10]={1, 8, 9, 8, 6, 15, 3, 36, 13, 16};
 InitList(L);
 CreateListF(L,a,10);
 DispList(L);
 cout<<endl;
 CreateListR(L,a,10);
 DispList(L);
 cout<<endl;
 cout<<Listlength(L)<<endl;
return 0;
}

发布了32 篇原创文章 · 获赞 4 · 访问量 2296

猜你喜欢

转载自blog.csdn.net/delete_bug/article/details/105375729
今日推荐