链表定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表c++代码:
#include<bits/stdc++.h>
using namespace std;
int i,j;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkNode;
///头插法
void creativeList(LinkNode *&L,ElemType a[],int n)
{
LinkNode*s;
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
for(i=0; i<n; i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=L->next;
L->next=s;
}
printf("链表(头插法)创建成功\n");
}
///尾插法
void CreatListR(LinkNode*&L,ElemType a[],int n)
{
LinkNode*s,*r;
L=(LinkNode*)malloc(sizeof(LinkNode));
r=L;
for(int i=0; i<n; i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
printf("链表(尾插法)创建成功\n");
}
///初始化线性表
void initList(LinkNode*&L)//初始化
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
}
///销毁线性表
void destoryList(LinkNode*&L)//销毁
{
LinkNode *before=L,*after=L->next;
while(after!=NULL)
{
free(before);
before=after;
after=before->next;
}
free(before);
}
int ListLength(LinkNode *&L)//取长度(不包含头节点)
{
int n=0;
LinkNode *p=L;
while(p->next!=NULL)
{
n++;
p = p->next;
}
return n;
}
///按元素值查找
int LocateElem(LinkNode*L,ElemType e)//查找值为e的元素
{
int i=1;
LinkNode *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return (0);
else
return (i);
}
///插入数据元素
bool TAKEinElem(LinkNode*&L,int i,ElemType e)//增
{
int j=0;
LinkNode *p=L,*s;
if(i<=0)
return false;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
return false;
}
else
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
cout<<"插入成功:"<<endl;
return true;
}
}
bool DeleteElem(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);
cout<<"删除成功:"<<endl;
return true;
}
}
void DispList(LinkNode*L)//输出
{
LinkNode*p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
bool GetElem(LinkNode *L, int i, ElemType &e)//求线性表中某个数据元素值
{
int j = 0;
LinkNode *p = L;
if (i <= 0)
{
return false;
}
while (j < i&&p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
{
return false;
}
else
{
e = p->data;
return true;
}
}
int main()
{
int n,k,t,m,x,v,s=1;
cout<<"输入n,然后输入n个元素"<<endl;
LinkNode*L;
ElemType a[100];
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
}
initList(L);
cout<<"1.头插法 2.尾插法"<<endl;
while(s)
{
s--;
cin>>v;
switch(v)
{
case 1:
{
creativeList(L,a,n);
DispList(L);
break;
}
case 2:
{
CreatListR(L,a,n);
DispList(L);
break;
}
default:
printf("输入错误!!!\n");
s++;
}
}
//creativeList(L,a,n);
//DispList(L);
//CreatListR(L,a,n);
//DispList(L);
cout<<"在第k个元素插入t"<<endl;
cin>>k>>t;
TAKEinElem(L,k,t);
DispList(L);
cout<<"删除第m个元素"<<endl;
cin>>m;
DeleteElem(L,m,x);
DispList(L);
return 0;
}