数据结构回顾

顺序表与链表的综合比较:

如何确定用哪种结构呢?

此问题要从两方面来考虑:一.线性表的长度是否能预先确定?在程序执行中,长度的变化范围是否大?

二. 若是对线性表频繁查找,很少插入或删除,则用顺序表为好;若线性表频繁进行插入或删除操作的话,这应该采用链表。

顺序表编程实例(已经编译通过,可运行):

#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;    
}

结果如下:


大家可以根据自己的需要更改代码大笑

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值