#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
typedef int ElemType;
typedef struct Node
{
ElemType data; //结点的数据域
struct Node *next; //结点的指针域但是又是指向下一个结点的所以就用结构体来的定义
}Node;
typedef struct Node *LinkList; //定义一个指向结构体的指针
//初始化单链表
status InitList(LinkList &L)
{
L = new Node; //或者L = (LinkList)malloc(sizeof(Node));
L->next = NULL; //空表
return OK;
}
//判断单链表是否为空
status Empty(LinkList L)
{
if(L->next == NULL)
{
return FALSE;
}
else
{
return TRUE;
}
}
//获取单链表的长度
status Length(LinkList L)
{
int i=0; //定义一个计数器用来计算长度
LinkList p; //需要定义一个新的指针变量
p = L->next; //指向头节点
while(p != NULL) //条件是p不是空就一直做计数器加1操作然后p指向他的后继结点
{
i++;
p = p->next;
}
return i;
}
//单链表的插入
status ListInsert(LinkList L,int i,ElemType e)
{
LinkList p; //定义以一个指针
p = L;
int j=1;
while(p !=NULL && j<i)
{
p=p->next;
j++;
}
if(p == NULL)
{
return ERROR;
}
LinkList q;
q = new Node; //定义一个新的结点q
q->data = e;
q->next = p->next; //插入结点的后面设置成自身结点的后面
p->next = q; //插入结点的后面设置成自身结点
return OK;
}
//删除
status ListDelete(LinkList &L,int i,ElemType &e)
{
LinkList p;
p = L;
int j=1;
while(p && j<i)
{
p=p->next;
j++;
}
LinkList q;
q = p->next;
q->next = p->next; //注意不能改变操作顺序 如果模糊的可以画图来看比较清晰
e = q->data; //删除之前要先保存一下数据
free(q);
return OK;
}
//清除
status ClearList(LinkList &L)
{
LinkList p,q; //生成两个结构型的新指针
p = L->next; //p用来指向首元结点
while(p != NULL)
{
q = p->next; //令q指向p的后继结点
free(p); //把p释放掉
p = q; //在把q换成(赋值成)p
}
L->next = NULL; //要把头结点的指针域置空
return OK;
}
//按位序取值
status Getelem(LinkList L,int i,ElemType &e)
{
LinkList p; //定义一个新的结构指针变量
p = L->next; //让p指向首元结点
int j = 1;
while(p&&j<i)
{
p = p->next; //按链扫描
j++;
}
if(!p)
{
return ERROR;
}
e = p->data;
return e;
}
//按值查找
status Finde(LinkList L,ElemType e)
{
LinkList p; //
p = L->next;
int j = 1 ;
while(p)
{
if(p->data=e)
{
return j;
}
p=p->next;
j++;
}
return ERROR;
}
//前插法创建单链表
status Head(LinkList &L)
{
L = new Node; //先定义一个新的结点当头节点
L->next=NULL; //指针域置空
for(int i=1;i<9;i++)
{
LinkList p = new Node; //定义一个新的结点p
p->data = i;
p->next = L->next; //把首元结点赋值给p的后继结点
L->next = p; //首元结点设置为p
}
return OK;
}
//尾插法
status Last(LinkList &L)
{
L = new Node;
LinkList t; //表示尾指针
t = L; //尾指针指向头节点
int i;
for(i=5;i<14;i++)
{
LinkList p = new Node; //定义一个新的结点
p->data = i;
t->next = p; //令p等于首元结点
t = p; //让尾指针指向首元结点
}
t->next = NULL;
return OK;
}
//打印单链表
status print(LinkList L)
{
LinkList p;
p = L->next;
int i = 1;
while(p)
{
printf("第%d的值是%d\n",i,p->data);
p = p->next;
i++;
}
return OK;
}
int main()
{
LinkList L1,L2;
int e;
printf("头插法的单链表的结果L1: \n");
Head(L1);
print(L1);
printf("尾插法的单链表的结果L2: \n");
Head(L2);
print(L2);
printf("L1长度位%d,L2长度为%d\n",Length(L1),Length(L2));
printf("L1第三个位置插入666得:\n");
ListInsert(L1,3,666);
print(L1);
Getelem(L1,8,e);
printf("L1中的第8个元素:%d\n",e);
printf("清空单链表可得:\n");
ClearList(L1);
print(L1);
return 0;
}