#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode
{ //定义单链表节点类型
ElemType data; //每个结点存放下一个数据元素
struct LNode *next; //指针指向下一个结点
} LNode, *LinkList;
/*
bool InitList(LinkList L)
{ //初始化一个单链表(带头结点)
L = (LNode *)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
*/
//头插法建立单链表(逆向建立单链表)
LinkList List_HeadInsert(LinkList L)
{
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("&d", &x);
while (x != 666)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
}
/*尾插法建立单链表(正向建立单链表)
LinkList List_TailInsert(LinkList L)
{
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L; // r为表尾指针
scanf("%d", &x); //输入结点值
while (x != 666)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s; // r指向新的表尾结点
scanf("%d", &x);
}
r->next = NULL; //尾结点指针置空
return L;
}
*/
bool Empty(LinkList L) //判断单链表是否为空
{
if (L->next == NULL)
return true;
else
return false;
}
//按值查找表结点
LNode *LocateElem(LinkList L, ElemType e)
{
LNode *p = L->next;
while (p != NULL && p->data != e) //从第一个结点开始查找data域为e的结点
p = p->next;
return p; //找到后返回该结点的指针,否则返回NULL
}
//按位查找
LNode *GetElem(LinkList L, int i)
{
int j = 0;
if (i < 0)
return NULL;
else
{
LNode *p; //指针p指向当前扫描到的结点
p = L; // L指向头结点,头结点是第0个结点
while (p != NULL && j < i)//循环找到第i个结点
{
p = p->next;
j++;
}
return p;
}
}
//第i个位置插入元素e
bool ListInsert(LinkList L, int i, ElemType e)
{
if (i < 1)
return 1; //插入位置不合法
LNode *p; //指针指向当前扫描到的结点
int j = 0; //计数器,记录当前扫描到的是第几个结点
p = 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;
p->next = s->next;
p->next = s; //将结点S连接到p之后
return true; //插入成功
}
//删除单链表上的第i个结点
bool ListDelete(LinkList L, int i, ElemType e)
{
int j = 0;
LNode *p, *q;
p = L;
while (p->next && j < i - 1)
{ //循环找到第i-1个结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) //前者表明p指针已经指向最后结点;后者表明要删除头结点
return false;
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
//求单链表的长度
int Length(LinkList L){
int len = 0;//统计表长
LNode *p = L;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}