- 顺序结构
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
typedef int Elemtype;
typedef struct
{
Elemtype *elem;
int length;
}Sqlist;
Status Initlist(Sqlist* L)
{
L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));
if(!L->elem)
return ERROR;
L->length=0;
return OK;
}
/*
插入操作
初始条件:顺序表L已存在
操作结果:在L中的第i个位置之前插入新的数据元素e,L的长度加1
*/
Status ListInsert(Sqlist *L,int i,Elemtype e)
{
if(L->length==MAXSIZE||i<1||i>L->length+1)//三种情况特判,线性表已满或者i不在此范围内
return ERROR;
if(i<=L->length)//插入位置在表尾之前
{
for(int k=L->length-1;k>=i-1;k--)
{
L->elem[k+1]=L->elem[k];
}
}
L->elem[i-1]=e;//这种情况囊括了i在表尾,即i=L->length+1;
L->length++;
return OK;
}
Status Listdelete(Sqlist *L,int i,Elemtype *e)
{
if(L->length==0||i<1||i>L->length)
return ERROR;
*e=L->elem[i-1];
if(i<L->length)//删除位置不在最后一个
{
for(int k=i-1;k<L->length-1;k++)
{
L->elem[k]=L->elem[k+1];
}
}
L->length--;
return OK;
}
Status GetElem(Sqlist L,int i,Elemtype *e)
{
if(L.length==0||i<1||i>L.length)
return 0;
*e=L.elem[i-1];
return OK;
}
void output(Sqlist L)
{
cout<<"当前线性表长度"<<L.length;
for(int i=0;i<L.length;i++)
cout<<L.elem[i]<<" ";
}
int main()
{
Sqlist L;
printf("------构造一个空的线性表L------\n");
Initlist(&L);
output(L); //打印结果
printf("------测试插入10个数------\n");
for(int i = 1;i <= 10; i++){
ListInsert(&L,i,i);
}
output(L); //打印结果
printf("------在第三位之前插入0------\n");
ListInsert(&L,3,0);
output(L); //打印结果
printf("------删除第6位的数据------\n");
Elemtype e;
Listdelete(&L,6,&e);
printf("删除的数据为:%d\n", e);
output(L); //打印结果
printf("------获取元素操作------\n");
GetElem(L,5,&e);
printf("得到第5个元素:%d", e);
}
- 链式结构
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
using namespace std;
typedef int status;
typedef int elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}node;
typedef struct node* linklist;
/*typedef struct
{
int lenght;
node* next;
}*linklist;
//构造空链表
把头结点和普通节点分开后的一种初始化方法
status initlist(linklist *L)
{
linklist p=(linklist)malloc(sizeof(linklist));
node *q=(node *)malloc(sizeof(node));
q->next=NULL;//q是头结点,p是指向头结点的头指针
p->next=q;
p->lenght=0;
(*L)=p;//头结点在p的位置
return OK;
}
*/
//头插法(随机赋值)
status createlisthead(linklist *L,int n)
{
linklist p;
int i;
srand(time(0));//初始化随机数种子
*L= (linklist)malloc(sizeof(node));
(*L)->next=NULL;
for(int i=0;i<n;i++)
{
p=(linklist)malloc(sizeof(node));
p->data=rand()%100+1;
p->next=(*L)->next;//先接后再续前
(*L)->next=p;
}
}
//尾插法
status createlisttail(linklist *L,int n)
{
linklist p,r;
srand(time(0));
*L=(linklist)malloc(sizeof(linklist));
(*L)->next=NULL;
r=*L;
for(int i=0;i<n;i++)
{
p=(linklist)malloc(sizeof(linklist));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;//区别:头插法中在最开始就确定了最后一位是null;
return OK;
}
//读取
status getelem(linklist L,int i,elemtype *e)
{
int j=1;
linklist p=L->next;
while(p&&j<i)//i从第二个开始
{
p=p->next;
++j;
}
if(!p||j>i)//即p为空,或者i<1时不行
return ERROR;
*e=p->data;
return OK;
}
//插入,,与上面读取的一个区别是在赋初值是上面令p为L->NEXT
//即第一个节点,这样while一下后p在i的位置,j=i+1
//而插入的位置是第i个元素之前,所以把p放到头结点的位置
status listinsert(linklist *L,int i,elemtype e)
{
linklist p,s;
int j=1;
p=*L;
while(p&&j<i)//i从第二个开始
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
s=(linklist)malloc(sizeof(node));
s->data=e;//给s新建节点然后把数据放进去
s->next=p->next;
p->next=s;
return OK;
}
status listdelete(linklist *L,int i,elemtype *e)
{
linklist p,q;
int j=1;
p=(*L);
while(p&&j<i)//i从第二个开始
{
p=p->next;
++j;
}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return 0;
}
//整表删除
status clearlist(linklist *L)
{
linklist p,q;
p=(*L)->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
(*L)->next=NULL;
return OK;
}
int main()
{
linklist L;
createlisthead(&L,10);
for(int i=1;i<=10;i++)
{
elemtype a;
getelem(L,i,&a);
cout<<a<<endl;
}
listinsert(&L,5,10);
for(int i=1;i<12;i++)
{
elemtype a;
getelem(L,i,&a);
cout<<a<<endl;
}
int c;
listdelete(&L,5,&c);
for(int i=1;i<11;i++)
{
elemtype a;
getelem(L,i,&a);
cout<<a<<endl;
}
clearlist(&L);
for(int i=1;i<11;i++)
{
elemtype a;
getelem(L,i,&a);
cout<<a<<endl;
}
}