线性表有两种普遍的存储方式:顺序存储和链式存储。
顺序存储的最大特点是简单,简单的读取操作方便,而其致命的缺点是当进行插入或删除操作时,需要移动大量的元素,耗费时间,而此缺点链式存储恰可以完美的解决。
下面是链表一系列操作的代码,用户自定义函数主要包括:
/*
//创建一个链表_头插法√
//创建一个链表_尾插法√
//置空表√
//求列表长度√
//取得节点i位置的数值√
//按值查找结点location√
//插入节点√
//删除结点√
//显示链表√
*/
代码:
#include <iostream>
#include<stdlib.h>
#include <malloc.h>
using namespace std;
#define null 0
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node * next;
}node, * linklist;
//创建一个链表
//头插法√
linklist creatlist1()
{
linklist head;
linklist p;
linklist r=(linklist)malloc(sizeof(struct node));
int i=0;
head=r;
r->next=null;
int n=0;
cin>>n;//链表长度
for(i=1;i<=n;i++)
{
p=(linklist)malloc(sizeof(struct node));
cin>>p->data;
p->next=r->next;
r->next=p;
}
return head->next;
}
//创建一个链表
//尾插法√
linklist creatlist2()
{
linklist head;
linklist p;
linklist r=(linklist)malloc(sizeof(struct node));
int i=0;
head=r;
r->next=null;
int n=0;
cin>>n;//链表长度
for(i=1;i<=n;i++)
{
p=(linklist)malloc(sizeof(struct node));
cin>>p->data;
r->next=p;
r=p;
}
r->next=null;
return head->next;
}
//置空表√
void setnull(linklist *list)//(*list是头指针),头指针为空,代表链表为null
{
*list=null;
}
//求列表长度【列表长度为0,也意味着这是一个空表】
//√
int length(linklist *list)
{
int n=0;
linklist ptr=* list;
while(ptr!=null)
{
n++;
ptr=ptr->next;
}
return n;
}
//取得节点i位置的数值,节点从第一个节点开始
//√
ElemType get(linklist *list, int i)
{
int j=1;
linklist ptr = * list;
while(j<i && ptr != null)
{
ptr=ptr->next;
j++;
}
if(ptr!=null)
{
return ptr->data;
}
else
{
cout<<"位置参数不正确!"<<endl;
return null;
}
}
//按值查找location
//√
int locate(linklist *list,ElemType x)
{
int n=0;
linklist ptr=* list;
while(ptr!=null && ptr->data!=x)
{
ptr=ptr->next;
n++;
}
if(ptr==null)
return -1;//查找不成功,返回-1
else
return n+1;
}
//插入节点√
void insert(linklist *list,ElemType x,int i)
{
int j=1;
linklist s,ptr;
s=(linklist)malloc(sizeof(struct node));//建立要插入的节点
s->data=x;
ptr=* list;
if(i==1)//作为头结点
{
s->next=ptr;
* list=s;
}
else
{
while(j<i-1 && ptr->next!=null)
{
ptr=ptr->next;
j++;
}
if(j==i-1)//找到第i-1个结点,ptr指向它
{
s->next=ptr->next;
ptr->next=s;
}
else
{
cout<<"插入位置不正确!"<<endl;
}
}
}
//删除结点√
void del(linklist *list, int i)
{
int j=1;
linklist ptr=*list;
if(i==1)//删除头结点
{
* list=ptr->next;
}
else
{
while(j<i-1 && ptr->next!= null)
{
ptr=ptr->next;
j++;
}
if(ptr->next!=null &&j==i-1)
{
ptr->next=ptr->next->next;
}
else
cout<<"位置参数不正确!"<<endl;
}
}
//显示链表√
void display(linklist * list)
{
linklist ptr= * list;
if(ptr==null)
cout<<"链表为空!"<<endl;
else
{
while(ptr->next!=null)
{
cout<<ptr->data<<" ";
ptr=ptr->next;
}
cout<<ptr->data<<endl;//显示最后一个结点
}
}
int main()
{
//创建一列表
linklist list =creatlist2();//5个数字,分别是a,b,c,d,e尾插法
//求列表长度
cout<<length(&list)<<endl;
//setnull(&list);
display(&list);
cout<<get(&list,2)<<endl;
cout<<locate(&list,'b')<<endl;
insert(&list,'x',2);
display(&list);
del(&list,2);
display(&list);
return 0;
}