本文将重点讲述单链表的创建以及相关操作的实现。其实在理解链表并不是什么困难的事情,很多人说指针很难,主要是被链表当中的指针的相关操作给难住了。在编写代码的时候需要指针的相关知识。建议大家先熟悉之前学过的指针的相关知识,这样再去理解链表就会变得轻松许多。
这里是一个讲解单链表的视频:https://www.bilibili.com/video/BV1Rb411F738?t=2521
希望大家可以实际编写相关代码,有助于更好的理解。下面是相关代码的展示:
#include<cstdio>
#include<cstdlib>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;
int length;
#define OK 1
#define ERROR 0;
int initList(LinkList &L,int &a); //初始化顺序表
int insertElem(LinkList &L,int &a,int b,int c); //插入数据
int deleteElem(LinkList &L,int a); //删除数据
int getElem(LinkList L,int a,int &e); //查找指定位置数据
int findElem(LinkList L,int e,int &a); //按值查找数据
void Input(LinkList &L,int &a,int b); //输入
void Output(LinkList L); //输出
int destroyList(LinkList &L); //销毁
int main(void)
{
int flag = 1;
int do_it;
int number;
int position;
int insert_elem;
int get_elem;
int elem;
int find_position;
while (flag)
{
printf("**********菜单栏**********\n");
printf("1.初始化\n");
printf("2.输入\n");
printf("3.插入数据\n");
printf("4.删除数据\n");
printf("5.指定位置查找数据\n");
printf("6.按值查找数据\n");
printf("7.输出\n");
printf("8.销毁\n");
printf("9.退出\n");
printf("**********菜单栏**********\n");
printf("请输入要执行的功能:");
scanf("%d",&do_it);
if (do_it < 1 || do_it >9)
{
printf("输入错误,请重新输入!\n");
}
else
{
switch (do_it)
{
case 1:
if(initList(L,length))
{
printf("初始化成功!表长为:%d\n",length);
}
else
{
printf("初始化失败!\n");
}
break;
case 2:
printf("请输入要插入的数据数量:");
scanf("%d",&number);
Input(L,length,number);
break;
case 3:
printf("请输入要插入数据的位置:");
scanf("%d",&position);
printf("请输入要插入的数据:");
scanf("%d",&insert_elem);
if(insertElem(L,length,position,insert_elem))
{
printf("插入成功!表长为:%d\n",length);
}
else
{
printf("插入失败!\n");
}
break;
case 4:
printf("请输入要删除数据的位置:");
scanf("%d",&position);
if(deleteElem(L,position))
{
printf("删除成功!表长为:%d\n",length);
}
else
{
printf("删除失败!\n");
}
break;
case 5:
printf("请输入要查找数据的位置:");
scanf("%d",&position);
if(getElem(L,position,get_elem))
{
printf("取值成功!数据为:%d\n",get_elem);
}
else
{
printf("取值失败!\n");
}
break;
case 6:
printf("请输入要查找的数据:");
scanf("%d",&elem);
if(findElem(L,elem,find_position))
{
printf("查找成功!所在位置为:%d\n",find_position);
}
else
{
printf("查找失败!\n");
}
break;
case 7:
Output(L);
break;
case 8:
{
if(destroyList(L))
{
printf("链表已销毁!\n");
}
}
case 9:
flag = 0;
break;
}
}
}
return 0;
}
int initList(LinkList &L,int &a)
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
a = 0;
return OK;
}
void Input(LinkList &L,int &a,int b)
{
LNode *p;
a = b;
printf("请倒序输入数据!\n");
for(int i = 0;i < b;i++)
{
p = (LNode *)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
printf("表长为:%d\n",b);
}
void Output(LinkList L)
{
LNode *p;
p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int destroyList(LinkList &L)
{
free(L);
return OK;
}
int insertElem(LinkList &L,int &a,int b,int c)
{
LNode *p;
LNode *s;
int j = 0;
p = (LNode *)malloc(sizeof(LNode));
p = L;
while(p && (j < b - 1))
{
p = p->next;
j++;
}
if(!p || (j > b-1))
{
return ERROR;
}
else
{
s = (LNode *)malloc(sizeof(LNode));
s->data = c;
s->next = p->next;
p->next = s;
length++;
return OK;
}
}
int deleteElem(LinkList &L,int a)
{
LNode *p;
LNode *q;
int j = 0;
p = L;
while((p->next) && (j < a-1))
{
p = p->next;
j++;
}
if(!(p->next) || j > a-1)
{
return ERROR;
}
else
{
q = p->next;
p->next = q->next;
free(q);
length--;
return OK;
}
}
int getElem(LinkList L,int a,int &e)
{
LNode *p;
int j = 1;
p = L->next;
while (p && j < a)
{
p = p->next;
j++;
}
if(!p || j > a)
{
return ERROR;
}
else
{
e = p->data;
return OK;
}
}
int findElem(LinkList L,int e,int &a)
{
LNode *p;
int j = 1;
p = L->next;
for(int i = 1;i < length;i++)
{
p = p->next;
j++;
if(p == NULL)
{
return ERROR;
}
if(p->data == e)
{
a = j;
return OK;
}
}
return 0;
}
代码中的注意事项大家可以参考严蔚敏版的数据结构,里面有很详细的讲解。需要注意的一点是这里由于用到了C++中的函数引用,源文件在命名时采用的时“.cpp”而不是“.c”。其他的语法基本与C语言相同。
如果您有什么见解和疑问,欢迎私信我或者联系我的邮箱:1308269670@qq.com