#include <stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//1.初始化一个单链表
bool InitList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)//内存不足,分配失败
return false;
L->next = NULL;//头节点后暂时没有数据节点
return true;
}
//2.按位序插入元素e(带头结点)
bool ListInsert(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
LNode *p;//指针p指向当前扫描到的结点
int j=0;//当前p指向的是第几个结点
p=L;//L指向头节点,头节点是第0个节点(不存数据)
while(p!=NULL && j<i-1){//循环找到第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;//将结点s连到p之后
return true;
}
//3.按位序删除
bool ListDelete(LinkList &L,int i,ElemType &e)
{
if(i<1)
return false;
LNode *p;//临时结点 ,用来指向当前扫描到的节点
int j=0;//当前p指向的是第J个结点
p=L;//L指向头节点,头节点是第0个节点(不存数据)
while(p!=NULL && j<i-1){//循环找到第i-1个结点
p=p->next;
j++;
}
if(p==NULL)
return false;
if(p->next == NULL)
return false;
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);//释放被删除的结点的内存空间
return true;
}
//4.输出线性表
void printList(LinkList L)
{
LNode *p = L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
//5.尾插法创建单链表,在第i个位置插入元素e
bool TailInsert(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
LNode *p;//指针p指向当前扫描到的结点
int j=0;//当前p指向的是第j个结点
p=L;//L指向头节点,头节点是第0个节点(不存数据)
while(p!=NULL && j<i-1){//循环找到第i-1个结点,方便在后面插入结点
p=p->next;
j++;
}
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;//将结点s连到p之后
return true;
}
//6.头插法
bool headInsert(LinkList &L,ElemType e)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;//将结点s连到p之后
}
//7.按位序查找元素
LNode *GetElem(LinkList L,int i)
{
int j=1;
LNode *p =L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
return p;
}
//8.按值查找位置
LNode * locateElem(LinkList L,ElemType e)
{
LNode *p =L->next;
while(p != NULL && p->data !=e)
p=p->next;
return p;
}
//9.求链表的长度
int Length(LinkList L)
{
int len=0;
LNode *p =L;
while(P->next !=NULL)
{
p=p->next;
len++;
}
return len;
}
int main(){
LinkList L;
InitList(L);
printf("=======链表插入元素测试=====\n");
ListInsert(L,1,9);
ListInsert(L,1,8);
ListInsert(L,1,7);
ListInsert(L,1,6);
printList(L);
printf("====链表删除元素测试=====\n");
ElemType e;
ListDelete(L,2,e);
printList(L);
printf("=====链表尾插法测试====");
InitList(L);
int arr[5]={6,7,8,9,10};
for(int i=1;i<=5;i++)
{
TailInsert(L,i,arr[i-1]);
}
printList(L);
printf("=====链表头插法测试===\n");
InitList(L);
for(int i=1;i<=5;i++)
{
headInsert(L,arr[i-1]);
}
printList(L);
printf("====链表查找测试===\n");
LNode* tmpNode = GetElem(L,3);
printf("链表第%个元素是%d\n",3,tmpNode->data);
//按值查找
tmpNode = LocateElem(L,9);
if(tmpNode == NULL)
printf("没找到!\n");
else
printf("找到了!\n");
int len =Length(L);
printf("链表的长度为=%d\n",len);
return 0;
}