欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不带头结点单链表的基本操作

程序员文章站 2022-03-15 17:37:08
...

定义结点

typedef struct LNode{
	int data;			//每个节点存放一个数据元素
	struct LNode *next; //指针指向下一个节点
}LNode,*LinkList;   //LinkList等价于LNode *,前者强调链表,后者强调结点

初始化

//初始化一个空的单链表
bool InitList(LinkList &L){
	L = NULL;  //空表
	return true;
}

判空

//判断单链表是否为空
bool Empty(LinkList L){
	return (L==NULL);
}

求表的长度

//求表的长度
int length(LinkList L){
	int len = 0;
	LNode *p = L;
	while(p != NULL){
		p = p->next;
		len++;
	}
	return len;
}

按位序插入

//按位序插入(不带头结点)
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
		return false;
	if(i==1){		//插入第一个结点的操作与其他结点不同
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L=s;		//头指针指向新结点
		return true;
	}
	LNode *p;
	int j=1;
	p = L;
	while(p!=NULL && j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

按位序删除

//按位序删除(不带头结点)
bool ListDelete(LinkList &L,int i,int &e){
	if(i<1)
		return false;
	if(i==1){
		LNode *r;
		r=L;
		e=r->data;
		L=r->next;
		free(r);
		return true;
	}
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	if(p->next==NULL)	//第i-1个结点之后已无结点
		return false;
	LNode *q=p->next;
	e = q->data;
	p->next=q->next;
	free(q);
	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 InsertPriorNode(LNode *p,int e){
	if(p==NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s==NULL)
		return false;
	s->next = p->next;
	p->next = s;		//新结点s连到p之后
	s->data = p->data;  //将p中元素复制到s中
	p->data = e;		//将p中元素覆盖为e
	return true;
}