单链表的基本运算
今天来给大家分享一下单链表的基本运算
以下代码如有需要可以直接复制,有运算结果供大家参考,欢迎大家留言评论,同时共同学习,共同进步
前言
以下代码可供刚刚接触数据结构的同学参考,本文介绍了单链表的基础操作。
提示:以下是本篇文章正文内容,下面案例可供参考
1、单链表的类型定义和创建
- 类型定义
typedef struct LinkNode
{
ElemType data;//数据元素
struct LinkNode *next;//定义一个指针结点,指向下一个元素
}LinkNode;
- 用头插法创建单链表
void CreateList(LinkNode *&L,ElemType a[],int n)
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
s->next=L->next;
L->next=s;
}
}
注意:创建的单链表位序与输入位序相反
有兴趣的同学也可以尝试采用尾插法建表
2.九大运算
1.初始化
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
2.销毁
void DestoryList(LinkNode *&L)
{
LinkNode *pre=L,*p=L->next;//定义一组指针队
while(p!=NULL)//当p不为空,执行下面操作
{
free(pre);//释放p的前驱
pre=p;
p=p->next; //p后移
}
free(pre);
}
3.判断是否为空表
bool ListEmpty(LinkNode *L)
{
if(L->next==NULL)
return 0;
return 1;
}
4.求单链表的长度
int ListLength(LinkNode*L)
{
int n=0;
LinkNode *p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}
5.打印输出单链表
void DispList(LinkNode *&L)
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
6.求第i个元素的值
int GetElem(LinkNode*L,int i,ElemType &e)//把第i个元素的值存放在e中
{
int j=0;
LinkNode *p=L;
if(i<1||i>ListLength(L))
return 0;//i不在范围内,返回0
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;//p为空,返回0
else
{
e=p->data;
return e;//否则返回e
}
}
7.求某个值的位置i
int LocateElem(LinkNode*L,ElemType e)
{
int i=1;
LinkNode *p=L;
while(p->next!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
8.插入
bool ListInsert(LinkNode *&L,int i,ElemType e)
{
int j=0;
LinkNode *p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
9.删除
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
int j=0;
LinkNode *p=L,*q;
while (j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL)
return 0;
else
{
e=q->data;
p->next=q->next;
free(q);
}
return 1;
}
}
3.全部代码 包含主函数
如果需要复制可直接复制粘贴以下代码
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LinkNode
{
ElemType data;
struct LinkNode *next;
}LinkNode;
void CreateList(LinkNode *&L,ElemType a[],int n)
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
for(int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
s->next=L->next;
L->next=s;
}
}
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void DestoryList(LinkNode *&L)
{
LinkNode *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
bool ListEmpty(LinkNode *L)
{
if(L->next==NULL)
return 0;
return 1;
}
int ListLength(LinkNode*L)
{
int n=0;
LinkNode *p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}
void DispList(LinkNode *&L)
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int GetElem(LinkNode*L,int i,ElemType &e)
{
int j=0;
LinkNode *p=L;
if(i<1||i>ListLength(L))
return 0;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
e=p->data;
return e;
}
}
int LocateElem(LinkNode*L,ElemType e)
{
int i=1;
LinkNode *p=L;
while(p->next!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
bool ListInsert(LinkNode *&L,int i,ElemType e)
{
int j=0;
LinkNode *p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
}
bool ListDelete(LinkNode *&L,int i,ElemType &e)
{
int j=0;
LinkNode *p=L,*q;
while (j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL)
return 0;
else
{
e=q->data;
p->next=q->next;
free(q);
}
return 1;
}
}
int main(){
int n=0;
LinkNode *L;
ElemType a[50];
int i=0,j=0,x=0,e=0,c=0,k,p;
int h=0;
printf("请输入顺序表的长度:\n");
scanf("%d",&n);
printf("输入数据表中各个数据元素:\n");
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
CreateList(L,a,n);
printf("建立的线性表为:\n");
DispList(L);
printf("===================================================\n") ;
printf(" 1.插入一个数据。\n");
printf(" 2.删除一个数据。\n") ;
printf(" 3.得到第i个元素的值。\n") ;
printf(" 4.查找某元素的值。\n") ;
printf(" 5.输出线性表的长度。\n");
printf(" 6.判断表是否为空。\n");
printf(" 7.结束。\n");
printf("===================================================\n") ;
while(h!=7){
printf("选择要进行的操作\n");
scanf("%d",&h);
if (h>= 1 && h<= 7)
switch (h)
{
case 1:
printf("请输入插入的位置i<0~curLen>:\n");
scanf("%d",&j);
printf("请输入插入的位值x:\n");
scanf("%d",&x);
printf("插入后的顺序表为:\n");
ListInsert(L,j,x);
DispList(L);
break;
case 2:
printf("请输入待删除的位置i<0~curLen>:\n");
scanf("%d",&c);
ListDelete (L,c,e);
printf("删除后的顺序表为:\n");
DispList(L);
break;
case 3:
printf("输入要得到第几个元素\n");
scanf("%d",&i);
GetElem(L,i,k);
printf("第%d个元素的值为%d\n",i,k);
break;
case 4:
printf("输入要查找的元素\n");
scanf("%d",&p);
LocateElem(L,p);
printf("这个元素的位置是%d\n",i+1);
break;
case 5:
printf("线性表的长度为%d\n",ListLength(L));
break;
case 6:
printf("判断是否为空表,输出0是空表,输出1不是空表\n输出的结果是:%d\n",ListEmpty(L));
break;
case 7:break;
}
}
return 0;
}