顺序表与链表的综合比较:
如何确定用哪种结构呢?
此问题要从两方面来考虑:一.线性表的长度是否能预先确定?在程序执行中,长度的变化范围是否大?
二. 若是对线性表频繁查找,很少插入或删除,则用顺序表为好;若线性表频繁进行插入或删除操作的话,这应该采用链表。
顺序表编程实例(已经编译通过,可运行):
#include <iostream>
using namespace std;
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int length;
}sqlist;
Status Initlist(sqlist *L){
for (int i=0;i<MAXSIZE;i++)
{
L->data[MAXSIZE]=0;
}
L->length=0;
return OK;
};//初始化链表
Status GetElem(sqlist L,int i,Elemtype *e){
if ((L.length==0)||i<0||i>L.length)
{
return ERROR;
}
*e=L.data[i-1];
return OK;
}//查找
Status ListInsert(sqlist *L,int i,Elemtype e)
{
if ((L->length==MAXSIZE)||(i<1)||(i>L->length+1))
{
return ERROR;
}
if (i<=L->length)//容易漏掉,是否插在表尾
{
for (int j=L->length;j>=i;j--)
{
L->data[j]=L->data[j-1];
}
}
L->data[i-1]=e;
L->length++;
return OK;
}//插入
Status ListDelete(sqlist *L,int i,Elemtype *e)
{
if ((L->length==0)||i<0||i>L->length)
{
return ERROR;
}
*e=L->data[i-1];
if (i<L->length)
{
for (int j=i;j>L->length;j++)
{
L->data[j-1]=L->data[j];
}
}
L->length--;
return OK;
}//删除
int main()
{
sqlist list1;
Initlist(&list1);
ListInsert(&list1,1,10);
ListInsert(&list1,2,20);
cout<<list1.data[0]<<endl;
cout<<list1.data[1]<<endl;
return 0;
}
链表插入,删除,头插法,尾插法
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Elemtype;
typedef struct Node{
Elemtype data;
struct Node *next;
}Node;
typedef struct Node * Linklist;
Status GetElem(Linklist L,int i,Elemtype *e)
{
Linklist p;
p=L->next;
int j;
for ( j=1;j<i&&p;j++)
{
p=p->next;
}
if (!p||j>i)
{
return ERROR;
}
*e=p->data;
return OK;
};
Status ListInsert(Linklist *L,int i,Elemtype e)
{
Linklist p;
//错了p=L->next;
p=*L;
int j;
for (j=1;j<i&&p;j++)
{
p=p->next;
}
if (!p||j>i)
{
return ERROR;
}
Linklist s;
s=(Linklist)malloc(sizeof(Node));
s->next=p->next;
s->data=e;
p->next=s;
return OK;
}
Status ListDelete(Linklist *L,int i,Elemtype *e)
{
Linklist p,q;
p=*L;
int j;
//cuo:for (int j=1;j<i&&p;j++)
for(j=1;j<i&&(p->next);j++)
{
p=p->next;
}
if (!p->next||j>i)
{
return ERROR;
}
q=p->next;
*e=q->data;
p->next=q->next;
free(q);
return OK;
}
void CreatListHead(Linklist *L,int n)
{
//先初始化一个空链表
*L=(Linklist)malloc(sizeof(Node));
//cuo:L->next=NULL;
(*L)->next=NULL;
Linklist p;
for (int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100;
p->next=(*L)->next;
(*L)->next=p;
}
}
void CreateListTail(Linklist *L,int n)
{
Linklist p,r;
*L=(Linklist)malloc(sizeof(Node));
r=*L;
for (int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(Node));
p->data=rand()%100;
r->next=p;
r=p;
}
r->next=NULL;
}
void ListPrintf(Linklist L)
{
Linklist p;
p=L->next;//易错:指向第一个
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
Linklist L;
CreateListTail(&L,10);
ListPrintf(L);
ListInsert(&L,2,100);
ListPrintf(L);
int a=0;
ListDelete(&L,2,&a);
ListPrintf(L);
return 0;
}
结果如下:
大家可以根据自己的需要更改代码