版权声明:转载请注明 https://blog.csdn.net/qq_34720818/article/details/88078794
线性表的链式存储结构基本操作代码实现
一、创建单链表:从表尾到表头逆向创建
bool CreateList_L(LinkList L,int n)
{
printf("------创建链表开始------\n");
LinkList p;
for (int i=n;i>0;i--)
{
printf("输入第%d个结点数据\n",i);
p=(LinkList)malloc(sizeof(LNode));
scanf_s("%d",&p->data);
//将p插入到表头
p->next=L->next;
L->next=p;
}
printf("------创建链表完成------\n");
return true;
}
二、打印链表数据
bool PrintList(LinkList L)
{
printf("------打印链表数据开始------\n");
LNode *p=L->next;
while (p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n------打印完成!------\n");
return true;
}
三、查找单链表结点
bool GetElem_L(LinkList L,int pos,ElemType *e)
{
LinkList p=L->next;//L为头指针,p指向头结点
int j=1;//计数器
while (p&&j<pos)//寻找p指向第pos个结点或者为空
{
p=p->next;
j++;
}
if (!p||j>pos)//pos大于表长或者pos小于1
{
return false;
}
*e=p->data;
return true;
}
四、插入结点
bool ListInsert(LinkList L,int pos,ElemType e)
{
printf("------插入链表结点开始------\n");
LinkList p=L;//p指向头节点
int j=0;//计数器
while (p&&j<pos-1)//寻找p指向第pos-1个结点
{
p=p->next;
j++;
}
if (!p||j>pos-1)
{
return false;
}
LinkList s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
printf("------插入链表结点数据%d完成------\n",e);
return true;
}
五、删除结点
bool ListDelete(LinkList L,int pos,ElemType *e)
{
printf("------删除链表结点开始------\n");
LinkList p=L;
int j=0;
while (p->next&&j<pos-1)//寻找p指向第pos-1个结点
{
p=p->next;
j++;
}
if (!p->next||j>pos-1)
{
return false;
}
LinkList q=p->next;
p->next=q->next;
*e=q->data;
free(q);
printf("------删除链表结点数据%d完成------\n",*e);
return true;
}
六、获取表长
int ListLength(LinkList L)
{
LinkList p=L->next;
int len=0;
while (p)
{
len++;
p=p->next;
}
return len;
}
七、判断链表中是否有某数据
bool IsListData(LinkList L,ElemType dt)
{
LinkList p=L->next;
for (int i = 0; i < ListLength(L); i++)
{
if (dt==p->data)
return true;
p=p->next;
}
return false;
}
六、程序运行
#include "stdafx.h"
#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("输入创建链接结点个数\n");
int n;
scanf_s("%d",&n);
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立带头结点的单链表
CreateList_L(L,n);
PrintList(L);
ListInsert(L,4,4);
PrintList(L);
ElemType *e=(ElemType*)malloc(sizeof(ElemType));
ListDelete(L,4,e);
PrintList(L);
GetElem_L(L,1,e);
printf("链表第1个结点数据为%d\n",*e);
system("pause");
return 0;
}