不带头节点的单链表
1、操作实现1.1单链表的定义1.2初始化单链表1.3得到单链表表长1.4单链表的判空操作1.5建立单链表1.5.1头插法1.5.2尾插法
1.6按值查找结点1.6.1得到一个结点1.6.2得到该结点的位置
1.7按位查找结点1.7.1得到一个结点1.7.2得到该位置结点的数据
1.8插入数据1.9删除数据1.10输出表中数据1.11清空表
2、全部代码
相对于带头结点的单链表对每一个结点的操作比较统一,不带头结点的单链表需要对第一个结点进行特殊的对比操作。
1、操作实现
1.1单链表的定义
通过结构体定义每个结点的数据格式
typedef int ElemType
;
typedef struct LNode
{
ElemType data
;
LNode
* next
;
}LNode
,*LinkList
;
1.2初始化单链表
通过对单链表之间设置为空完成初始化
void InitList(LinkList
&L)
{
L = NULL;
}
1.3得到单链表表长
通过遍历实现获得单链表表长,如果第一个结点就为空则返回0
int
Length(LinkList
L)
{
int length
= 0;
if(L == NULL)
return length
;
else
length
++;
while(L->next
!= NULL)
{
length
++;
L = L->next
;
}
return length
;
}
1.4单链表的判空操作
通过判断第一个结点是否为空,判断单链表是否为空
bool
Empty(LinkList
L)
{
if(L == NULL)
return true;
else
return false;
}
1.5建立单链表
建立单链表分头插法和尾插法两种方式
1.5.1头插法
每次插入都在表头的位置
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.5.2尾插法
每次插入都在表尾的位置
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;
}
1.6按值查找结点
1.6.1得到一个结点
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
;
}
1.6.2得到该结点的位置
int
LocatedElem(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;
}
1.7按位查找结点
1.7.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
;
}
1.7.2得到该位置结点的数据
ElemType
GetElem(LinkList
L, int i
)
{
LNode
*p
= L;
if(i
< 0 || i
> Length(L))
return 0;
for(int j
= 1; j
< i
; j
++)
{
p
= p
->next
;
}
return p
->data
;
}
1.8插入数据
向表中对应位置插入数据
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;
}
1.9删除数据
删除表中某一位置的数据
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;
}
1.10输出表中数据
通过遍历的方式打印表中数据
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.11清空表
删除表中所有数据
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;
}
2、全部代码
#include
<stdio
.h
>
#include
<stdlib
.h
>
typedef int ElemType
;
typedef struct LNode
{
ElemType data
;
LNode
* next
;
}LNode
,*LinkList
;
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;
}
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;
}
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
LocatedElem(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 0;
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;
}
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");
}
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;
}
int
main()
{
LinkList
L;
LNode
* p
;
ElemType e
;
InitList(L);
if(Empty(L))
printf("表是空表\n");
else
printf("表不是空表\n");
List_TailInsert(L);
PrintList(L);
printf("表长为%d\n",Length(L));
p
= LocateElem_LNode(L,2);
printf("6的位置%d\n",LocatedElem(L,6));
printf("2号位置的数据%d\n",GetElem(L,2));
ListInsert(L,2,3);
printf("插入后的数据为");
PrintList(L);
ListDelete(L,1,e
);
printf("删除的元素为%d\n",e
);
printf("删除后的数据为");
PrintList(L);
ClearList(L);
if(Empty(L))
printf("表是空表\n");
else
printf("表不是空表\n");
return 0;
}