参考书:《数据结构(C语言版|第2版)》严蔚敏 李冬梅 吴伟民 编著
线性表链式存储的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是非连续的)
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
using namespace std;
int MAXSIZE =100;
typedef int ElemType;
typedef struct LNode
{
ElemType data ;//结点的数据域
struct LNode *next; //长度
} LNode,*LinKList;
//初始化
int InitList(LinKList &L)
{
L=new LNode;
L->next=NULL;
return 0;
}
//取值
int GetElem(LinKList L,int i)
{
LinKList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
{
printf("i值不合法,查找失败");
return -1;
}
else
{
int e=p->data;
return e;
}
}
//按值查找
void Find(LinKList L,ElemType e)
{
LinKList p;
p=L->next;
while(p&&p->data!=e)
p=p->next;
if(p)
printf("查找成功,您查找的数为:%d\n",p->data);
else
printf("您查找的数不存在");
}
//插入
void ListInsert(LinKList &L,int i,ElemType e)
{
LinKList p;
p=L;
int j=0;
while(p&&(j<i-1))
{
p=p->next;
++j;
}
if(p==NULL||j!=i-1)
printf("插入位置参数错误\n");
else
{
LinKList s;
s=(LinKList)malloc(sizeof(struct LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
//删除
int ListDelete(LinKList &L,int i)
{
LinKList p;
p=L;
int j=0;
while((p->next)&&(j<i-1))
{
p=p->next;
++j;
}
if(!(p->next)||(j>i-1))
{
printf("删除失败");
return 0;
}
else
{
LinKList q;
q=p->next;
p->next=q->next;
delete q;
return 0;
}
}
//求表长
int Length(LinKList L)
{
int e=0;
LinKList p;
p=L->next;
while(p)
{
p=p->next;
e++;
}
return e;
}
//打印
void ListPrint(LinKList L)
{
LinKList p=L->next;
printf("输出链表为:");
while(p)
{
printf("%d ", p->data);
p=p->next;
}
}
//前插法创建链表
void CreateList_H(LinKList &L,int n)
{
L=new LNode;
L->next=NULL;
for (int i=0; i<n; i++)
{
LinKList p;
p=(LinKList)malloc(sizeof(struct LNode));
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
//后插法创建链表
void CreateList_R(LinKList &L,int n)
{
L=new LNode;
L->next=NULL;
LinKList r;
r=L;
for (int i=0;i<n;i++)
{
LinKList p;
p=(LinKList)malloc(sizeof(struct LNode));
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
int main()
{
LinKList L;
InitList(L);
int n,len,m;
printf("请输入要创建链表节点的个数:");
scanf("%d",&n);
// CreateList_H(L,n);
CreateList_R(L,n);
//插入
ListInsert(L,3,6);
ListPrint(L);
len=Length(L);
printf("\n链表长度为:%d\n",len);
//按值查找
printf("按值查找的的结果为:");
Find(L,2);
//按序查找
m=GetElem(L,3);
printf("\n按序查找的的结果为:%d\n",m);
//删除
ListDelete(L,2);
ListPrint(L);
len=Length(L);
printf("\n链表长度为:%d\n",len);
return 0;
}
这里出的问题比较多的不清楚要给新生成的结构体分配地址空间,这一块出了比较多的问题。