.cpp
#include"SLinkNode.h"
#include<Stdio.h>
void main()
{
// LinkList L;
int i;ElemType e;
LNode *L;
InitList(L); //初始化
InsElem(L,2,1);InsElem(L,1,2); //插入
InsElem(L,4,3);InsElem(L,6,4);
InsElem(L,3,5);InsElem(L,5,6);
InsElem(L,9,7);InsElem(L,7,8);
InsElem(L,8,9);InsElem(L,0,10);
printf("单链表元素为:");DispList(L);
printf("单链表长度为:%d\n",GetLength(L)); //输出单链表长度
i=3;GetElem(L,i,e); //查找第i个元素为e
printf("第%d个元素为:%d\n",i,e);
e=2;
printf("表中元素等于%d的元素有%d个\n",e,Locate(L,e));//查找表中元素等于e的有多少个
i=3;DelElem(L,i); //删除第i个元素
printf("删除第%d个元素后单链表元素为:",i);DispList(L);
DestroyList(L); //销毁表
printf("----------------------------------------------------------------------\n");
InitList(L); //初始化
ElemType a[]={1,5,4,2,7,8,9}; //头插法整体创建单链表
CreateListF(L,a,7);
printf("单链表元素为:");DispList(L);
DestroyList(L); //销毁表
printf("----------------------------------------------------------------------\n");
InitList(L); //初始化
ElemType b[]={1,5,4,2,7,8,9}; //尾插法整体创建单链表
CreateListR(L,b,7);
printf("单链表元素为:");DispList(L);
DestroyList(L); //销毁表
printf("----------------------------------------------------------------------\n");
}
SLinkNode.h
#include<Stdio.h>
#include<Stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data; //数据域
struct node * next; //指针域
}LNode,* LinkList; //单链表结点类型声明,*LinkList为指向结构体LNode的指针类型
void InitList(LinkList &L)//初始化
{
L=(LNode * )malloc(sizeof(LNode)); //创建头节点L
L->next=NULL; //头结点next置为空表示空单链表
}
void DestroyList(LNode * &L) //销毁表
{
LNode * pre=L,* p=pre->next; //让pre指向头节点,p指向首结点
while(p!=NULL) //当B不为空时
{
free(pre); //释放pre空间
pre=p; //令pre向后移
p=p->next; //p向后移
}
free(pre); //释放pre指向的尾结点
printf("已销毁!\n");
}
int GetLength(LNode * L) //获取线性表长度
{
int i=0; //定义i作为计数器
LNode * p=L->next; //设置p为首结点
while(p!=NULL)
{
i++;
p=p->next; //p移向下一个结点
}
return i; //p为空时,i即为数据结点个数
}
void DispList(LNode * L) //输出单链表
{
LNode * p=L->next; //设置p为首结点
while(p!=NULL)
{
printf("%d ",p->data); //输出data域
p=p->next;
}
printf("\n");
}
int InsElem(LNode * &L,ElemType x,int i)//i为结点数
{
int j=0;
LNode * p=L,* s; //定义指针变量p为头节点,指针变量s
if(i<=0)
return 0; //如果节点数小于或等于0,返回0
while(p!=NULL&&j<i-1) //循环遍历单链表,查找第i-1个结点p
{
j++;
p=p->next;
}
if(p==NULL) //未找到i-1个结点时返回0
return 0;
else //找到i-1个结点时
{
s=(LNode * )malloc(sizeof(LNode));
s->data=x; //创建存放元素x的结点s
s->next=p->next; //将s结点插入到p结点后
p->next=s;
return 1;
}
}
int GetElem(LNode *L,int i,ElemType &e)//查找第i个元素的值
{
int j=0;
LNode *p=L;
if(i<=0)
return 0;
while(p!=NULL&&j<i)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
e=p->data;
return 1;
}
}
int Locate(LNode *L,ElemType e)//查找表中元素等于e的有多少个
{
int j=1;
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
j++;
}
if(p=NULL)
return 0;
else
return j;
}
int DelElem(LNode *&L,int i)//删除第i个元素
{
int j=0; //结点数j=0
LNode *p=L,*q; //定义指针变量p为头结点,以及指针变量q
while(p!=NULL&&j<i-1)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next; //将被删除点给q
if(q==NULL)
return 0;
else
{
p->next=q->next;//删除中间结点
free(q); //释放q所占空间
return 1;
}
}
}
void CreateListF(LNode *&L,ElemType a[],int n)//头插法整体创建单链表
{
LNode *s;int i;
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];//将数组a[i]的值放到s的数据域中
s->next=L->next;//将s指向首结点
L->next=s; //让结点s插入L
}
}
void CreateListR(LNode *&L,ElemType a[],int n)//尾插法整体创建单链表
{
LNode *s,*tc;int i;
tc=L; //tv始终指向尾结点,初始指向头结点
for(i=0;i<n;i++)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=a[i];//将数组a[i]的值放到s的数据域中
tc->next=s; //将s中放到首结点
tc=s; //结点s变成新的尾结点,让tc指向它
}
tc->next=NULL; //尾结点指针域next设为空
}