不带头结点的单链表各种操作,以函数的形式将各种功能展示出来了,读者可以根据函数功能在main函数里进行测试。
//不带头节点的操作
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L);//初始化单链表
int Length(LinkList L);
bool Empty(LinkList L);
void PrintList(LinkList L);//打印单链表
LinkList List_HeadInsert(LinkList &L);//头插法
LinkList List_TailInsert(LinkList &L);//尾插法
LNode* LocateElem_LNode(LinkList L,ElemType e);//按值查找结点1
int LocateElem(LinkList L,ElemType e);//得到该节点的位置
LNode* GetElem_LNode(LinkList L,int i);//按位查找结点2
ElemType GetElem(LinkList L,int i);//获取该节点的数据
bool ListInsert(LinkList &L,int i,ElemType e);//向表中插入数据
bool ListDelete(LinkList &L,int i,ElemType &e);//删除指定位置元素,并保存数据到e
bool ClearList(LinkList &L);//清空表
int main()
{
LinkList L;
LNode* p;
ElemType e;
InitList(L);
}
void InitList(LinkList &L)
{
L=NULL;
}
int Length(LinkList L)
{
int length=0;
if(L==NULL)//首先判断第一个节点是否为空
{
return length;
}
else
{
length++;
}
while (L->next!=NULL)
{
length++;
L=L->next;
}
return length;
}
bool Empty(LinkList L)
{
if(L==NULL)
{
return true;
}
else
{
return false;
}
}
void PrintList(LinkList L)
{
printf("表中数据为:");
if(L!=NULL)
{
printf("%d",L->data);
while (L->next!=NULL)
{
L=L->next;
printf("%d",L->data);
}
}
printf("\n");
}
//1,4,3,2
//头节点位置固定不变,后面每次插入的数据都是插到头节点后面的那个位置
LinkList List_HeadInsert(LinkList &L)
{
InitList(L);
LNode *s;
ElemType e;
printf("输入元素(9999停止)");
scanf("%d",&e);
if(e!=9999)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=e;
scanf("%d",&e);
while (e!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
scanf("%d",&e);
}
}
return L;
}
//从头节点开始依次往后面增加1,2,3,4,,,,
LinkList List_TailInsert(LinkList &L)
{
InitList(L);
LNode *s,*r;
ElemType e;
printf("输入元素(9999停止)");
scanf("%d",&e);
if(e!=9999)
{
L=(LinkList)malloc(sizeof(LNode));
L->data=e;
r=L;
scanf("%d",&e);
while (e!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
r->next=s;
r=s;
scanf("%d",&e);
}
}
r->next=NULL;
return L;
}
//在表中查找第一个与查找元素相同的节点
LNode* LocateElem_LNode(LinkList L,ElemType e)
{
int j=1;
LNode* p=L;
if (p->data==e)
{
return p;
}
else
{
p=p->next;
}
while (p!=NULL&&p->data != e)
{
p=p->next;
j++;
}
if (j==Length(L))//查找失败
{
return NULL;
}
return p;
}
int LocateElem(LinkList L,ElemType e)
{
int j=1;
LNode* p=L;
if (p->data==e)
{
return j;
}
else
{
p=p->next;
}
while (p!=NULL&&p->data!=e)
{
p=p->next;
j++;
}
if (j==Length(L))//查找失败
{
return 0;
}
return j+1;
}
//获取表中指定位置的结点
LNode* GetElem_LNode(LinkList L,int i)
{
LNode *p=L;
if (i<0||i>Length(L))
{
return NULL;
}
for (int j = 1; j < i; j++)
{
p=p->next;
}
return p;
}
ElemType GetElem(LinkList L,int i)
{
LNode *p=L;
if (i<0||i>Length(L))
{
return NULL;
}
for (int j = 1; j < i; j++)
{
p=p->next;
}
return p->data;
}
bool ListInsert(LinkList &L,int i,ElemType e)
{
if (i<1||i>Length(L)+1)
{
return false;
}
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
if (i==1)
{
s->next=L;
L=s;
return true;
}
LNode *p=GetElem_LNode(L,i-1);
s->next=p->next;
p->next=s;
return true;
}
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if (i<1||i>Length(L))
{
return false;
}
if(L==NULL)
{
return false;
}
LNode* p;
LNode* q;
if (i==1)
{
p=L;
e=p->data;
q=L->next;
free(p);
L=q;
return true;
}
p=GetElem_LNode(L,i-1);//获取要删除结点的前一个结点
q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
bool ClearList(LinkList &L)
{
if (L==NULL)
{
return false;
}
LNode *p;
while (L->next!=NULL)
{
p=L->next;
L->next=p->next;
free(p);
}
L=NULL;//删除第一个结点
return true;
}