数据结构线性表的链式实现
还是不太清楚为什么在初始化的时候需要使用L=new LNode
语句,初始化这点是参考书上的语法实现的.
//在调用的函数中也只需要通过Linklist即可创建一个指针类型的LNode结构体并且将L赋值给创建的变量,可以实现多种基本操作
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
//已实现全部基本功能:线性表初始化,尾插法创建链表,取值,按值查找,遍历链表,删除链表元素,单链表的插入,置空链表,摧毁链表.首插法创建单链表.
typedef int ElemType;
//定义链式存储的结构体
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链式线性表的初始化
int InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
//通过尾插法创建单链表
//&L为插入的线性表,n为插入的值的个数
void CreatList(LinkList &L,ElemType n)
{
LinkList r,p; //r用来记录尾节点,p用来创建新的节点
int a; //a用来存入节点中的值
L->next=NULL;
r=L;
for(int i=0;i<n;++i)
{
p=new LNode;
scanf("%d",&a);
p->data=a;
p->next=NULL;
r->next=p;
r=p;
}
}
//前插法创建线性表
void NewCreatList(LinkList &L,ElemType n){
L->next=NULL;
int a;
LinkList q,p;
for(int i=0;i<n;i++)
{
p= new LNode;
scanf("%d",&a);
p->data=a;
p->next=L->next;
L->next=p;
}
}
//通过位置查找节点的数据
int GetElem(LinkList L)
{
int i,j,e;
printf("请输入需要查找的第i个节点:");
scanf("%d",&i);
if(i>=1){
LinkList p;
p=L->next;
j=1;
while(p&&j<i)//此时的p&&用来判断p是否为空节点
{
p=p->next;
++j;
}
if(!p||j>i)
{
return ERROR;
}
e=p->data;
printf("第%d个元素的值为%d",i,e);
printf("\n");
}
return OK;
}
//通过数据来寻找节点的位置
LinkList LocateElem(LinkList L)
{
//通过e的值来查找节点,通过i的值来查找第i个节点的值
LinkList A;
int e;
printf("请输入需要查找的数据:");
scanf("%d",&e);
A=L->next;
while(A)
{
if(A->data==e)
{
printf("%d存在于链表中",e);
printf("\n");
break;
}
else
{
A=A->next;
}
if(!A)
{
printf("%d不存在于链表",e);
}
}
printf("\n");
}
//遍历整个链表
void TravelList(LinkList L)
{
//L最初表示的是头节点,内部没有值,且next指向第一个节点
LinkList p; //创建一个p节点来遍历节点存储的值
p=L->next;
int i=1;
while(p)
{
printf("第%d个元素为:%d\n",i,p->data);
i++;
p=p->next; //令p指向下一个节点
}
printf("\n");
}
//删除链表指定元素
int DeleteList(LinkList &L)
{
LinkList p=L,q;
int i,j;
printf("需要删除第几个元素?");
scanf("%d",&i);
while((p->next)&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
{
return ERROR;
}
else
{
q=p->next;
p->next=q->next;
delete q;
return OK;
}
}
void InsertList(LinkList &L)
{
int i,j,value;
LinkList a,p=L;
printf("输入要插入元素的位置及元素值:");
scanf("%d",&i);
scanf("%d",&value);
for(j=0;j<i-1;j++)
{
p=p->next;
}
a->data=value;
a->next=p->next;
p->next=a;
}
//摧毁链表
void DestroyList(LinkList &L)
{
if(L->next)
{
L->next=NULL;
}
}
//滞空链表
void EmptyList(LinkList &L)
{
LinkList p=L;
while(p->next)
{
p->data=0;
p=p->next;
}
//最后一个元素指向null,在循环外面再将p的值置为0
p->data=0;
}
int main(){
LinkList A; //初始化一个链表A
int n=0; //n记录插入链表的长度
//初始化并创建一个链表
if(InitList(A))
{
printf("初始化成功!");
printf("请输入需要创建的链表的长度:");
scanf("%d",&n);
NewCreatList(A,n);
}
TravelList(A);//遍历检验一遍元素值
//通过节点的值来查找节点的位置
printf("按值查找:");
LocateElem(A);
//通过节点的位置查找节点位置的值
printf("按位置查找:");
GetElem(A);
//删除链表中一元素并遍历检验
DeleteList(A);
TravelList(A);
//向链表中插入元素并遍历
InsertList(A);
TravelList(A);
//置空线性表并遍历
EmptyList(A);
TravelList(A);
//摧毁线性表
DestroyList(A);
if(!(A->next))
{
printf("摧毁成功!");
}
return 0;
}
参考文献:
数据结构c语言版