#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//对单链表的初始化操作:
bool InitList(LinkList &L)
{
L=NULL;
return true;
}
LNode* GetElem(LinkList &L,int i)
{
if(i<0)return NULL;
LNode* p;
int j=1;
p=L;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}
bool InsertNextNode(LNode* p,ElemType 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;
}
//在单链表的第i个元素插入元素e
bool ListInsert(LinkList &L,int i,ElemType e)
{
if(i<1)return false;
if(i==1&&L==NULL)
{
LNode* s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)return false;
s->data=e;
s->next=NULL;
L=s;
return true;
}
LNode* p=GetElem(L,i-1); //找到第i-1个结点
return InsertNextNode(p,e); //在p的后面插入新元素e
}
//求单链表的长度:
int Length(LinkList L)
{
int len=0;
LNode *p=L;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
//按位删除:
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)return false;
LNode* p;
if(i==1)
{
p=L;
L=p->next;
e=p->data;
free(p);
return true;
}
p=GetElem(L,i-1);
if(p==NULL||p->next==NULL)return false;
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
//判断单链表是否为空
bool Empty(LinkList L)
{
return (L==NULL);
}
int main()
{
//声明一个指向单链表的指针
LinkList L;
//完成对它的初始化操作:
InitList(L);
//使用按位插入的操作,依次向空表中插入8个元素
for(int i=1;i<=8;i++)
if(ListInsert(L,i,i))printf("成功插入元素:%d\n",i);
//输出当前表的长度:
printf("此单链表长度为: %d\n",Length(L));
//采用按位删除的方式,删除各个元素
int e;
for(int i=1;i<=8;i++)
{
ListDelete(L,1,e);
printf("成功删除元素 %d\n",e);
}
//判断当前链表是否为空:
if(Empty(L))printf("此链表为空!\n");
else printf("此链表不为空!\n");
return 0;
}
不带头结点的单链表的查找、插入和删除
最新推荐文章于 2024-04-08 17:27:48 发布