#include <stdio.h>
#include <malloc.h>
#define Maxsize 50;
typedef int ElemType; //假设ElemType为int类型,使用以下自定义类型语句:
typedef struct LNode
{
ElemType data; //存放元素值
struct LNode *next;//指向后继节点
}LinkNode; //单链表结点类型
//1.初始化线性表LinkList *&L
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL; //创建头结点,其next域置为NULL
}
//2.销毁线性表DestroyList(&L)
void DestroyList(LinkNode *&L)
{
LinkNode * pre=L,*p=L->next;//per指向结点p的前驱节点
while(p != NULL) //扫描单链表L
{
free(pre); //释放pre结点
pre=p; //per、p同步后移一个结点
p=pre->next;
}
free(pre); //循环结束时p为NULL,pre指向尾结点,释放它
}
//3.判断线性表是否为空表ListEmpty(L)
bool ListEmpty(LinkNode *L)
{
return(L->next==NULL);
}
//4.求线性表的长度ListLength(L)
int ListLength(LinkNode *L)
{
int n=0;
LinkNode *p=L; //p指向头结点,n置为0(即头结点的序号为0)
while(p->next != NULL)
{
n++;
p=p->next;
}
return(n); //循环结束,p指向尾结点,其序号n为结点个数
}
//5.输出线性表DispList(L)
void DisNode(LinkNode *L)
{
LinkNode *p=L->next; //p指向首结点
while(p != NULL) //p不为NULL,输出p结点的data域
{
printf("%d ",p->data);
p=p->next; //p移向下一个结点
}
printf("\n");
}
//6.求线性表中的某个数据元素值GetElem(L,i,&e)
bool GetElem(LinkNode *L,int i,ElemType &e)
{
int j=0;
LinkNode *p=L; //p指向头结点,j置为0(即头结点的序号为0)
if(i <= 0) return false;//i错误返回假
while (j<i && p!=NULL) //找第i个结点p
{
j++;
p=p->next;
}
if(p == NULL) //不存在第i个数据结点,返回false
return false;
else
{ //存在第i个数据结点,返回true
e=p->data;
return true;
}
}
//7.按元素值查找LocateElem(L,e)
int LocateElem(LinkNode *L,ElemType e)
{
int i=1;
LinkNode *p=L->next; //p指向首结点,i置为1,(即首结点的序号为1)
while(p!=NULL && p->data!=e) //查找data值为e的结点,其序号为i
{
p=p->next;
i++;
}
if(p == NULL) //不存在值为e的结点,返回0
return 0;
else //存在值为e的结点,返回其逻辑序号i
return (i);
}
/*8、插入数据元素(&L,i,e)
先在单链表L中找到第i-1个结点,由p指向它。若存在这样的结点
将值为e的结点(s指向它)插入到p所指结点的后面
*/
bool ListInsert(LinkNode *&L,int i,ElemType e)
{
int j=0;
LinkNode *p=L, *s; //p指向头结点,j置为0(即头结点的序号为0)
if(i<=0) return false; //i错误返回false
while (j<i-1 && p!=NULL)//查找第i-1个结点p
{
j++;
p=p->next;
}
if(p==NULL) //未找到第i-1个结点,返回false
return false;
else //找到第i-1个结点p,插入新结点并返回true
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e; //创建新结点s,其data域置为e
s->next=p->next; //将结点s插入到结点p之后
p->next=s; //大话数据结构P55
return true;
}
}
//9.删除数据元素ListDelete(&L,i,&e)
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
int j=0;
LinkNode *p=L,*q;
if(i <= 0)return false;
while(j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
if(p == NULL)
return false;
else
{
q=p->next;
if(q == NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
int main()
{
LinkNode *h;
ElemType e;
printf("单链表的基本运算如下:\n");
printf("1.初始化单链表h:");
InitList(h);
printf("2.依次采用尾插法插入10,20,30,40,50元素:\n");
ListInsert(h,1,10);
ListInsert(h,2,20);
ListInsert(h,3,30);
ListInsert(h,4,40);
ListInsert(h,5,50);
printf("3.输出单链表h:");
DisNode(h);
printf("4.单链表h的长度为:%d\n",ListLength(h));
printf("5.单链表h为:%s\n",(ListEmpty(h)?"空":"非空"));
GetElem(h,5,e);
printf("6.单链表h的第五个元素是:%d\n",e);
printf("7.元素20的位置:%d\n",LocateElem(h,20));
printf("8.在第4个元素位置插入元素35\n");
ListInsert(h,4,35);
printf("9.输出单链表h:");
DisNode(h);
printf("10.删除单链表h的第3个元素:\n");
ListDelete(h,3,e);
printf("11.输出单链表h:");
DisNode(h);
printf("12.释放单链表h:");
DestroyList(h);
}
线性表基本运算在单链表中的实现
最新推荐文章于 2023-10-19 22:58:03 发布