线性表的结构体定义和基本操作

一、线性表的结构体定义

#define maxSize 100 //定义整型变量maxSize为100

1.顺序表的结构体定义

typedef struct{
int data[maxSize];
int length;
}sqlist;

2.单链表的结点定义

typedef struct LNode{
int data;
struct LNode *next;
}LNode;

2.双链表结点定义

typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;

ps:结点是内存中一片由用户分配的存储空间,只有一个地址来表示它的存在,没有显式的名称,因此我们会在分配链表结点空间的时候,同时定义一个指针,来存储这片空间的地址(这个过程通俗地讲叫指针指向结点),并且常用这个指针的名称来作为结点的名称。
例如下边这句代码:

LNode *A=(LNode *)malloc(sizoof(LNode));

用户分配了一片LNode型空间,也就是构造了一个LNode型的结点,这时候定义一个名字为A的指针来指向这个结点,同时我们把A也当作这个结点的名字。注意,这里A命名了两个东西:一个是结点,另一个是指向这个结点的指针。

二、顺序表的操作

(1)初始化顺序表的算法
只需要将length设置为0,代码如下:

void initList(Sqlist &L){
L.length=0;
}

(2)求指定位置元素的算法
用e返回L中p位置上的元素,代码如下:

int getElem(Sqlist L,int p,int &e)
{
	if(p<0||p>L.length-1)
	return 0;
	e=L.data[p];
	return 1;
}

(3)按元素值查找算法

int findE(Sqlist L,int e){
int i;
for(i=0;i<L.length;++i){
	if(e==L.data[i]){
		return i;
		}
	}
	return -1;
}

(4)插入数据元素的算法
顺序表L的第p个位置上插入新的元素e,如果p的输入不正确则返回0,代表插入失败;如果p的输入正确,则将顺序表第p个元素以及以后元素右一个位置,腾出一个空位置插入新元素,顺序表的长度增加1,插入操作成功,返回1

int insertE(Sqlist &L,int p,int e){
int p,i;
if(p<0||p>L.length||L.length==maxSize)
return 0;
for(i=L.length-1;i>=p;--i)
L.data[i+1]=L.data[i]'
L.data[p]=e;
++(L.length);
return 1;
}

(5)删除指定位置的元素

int deleteElem(Sqlist &L,int p,int &e){
int i;
if(p<0||p>L.length-1)
	return 0;
	e=L.data[p];
	for(i=p;i<L.length-1;++i)
	L.data[i]=L.data[i+1];
	--(L.length);
	return 1;
}

三、单链表的操作

(1)建立链表
①尾插法建立

//假设有n个元素存储在数组a中,用尾插法建立链表C 
void createlistR(LNode *&C,int a[],int n){
	LNode *s,*r;
	int i;
	C=(LNode*)malloc(sizeof(LNode));
	C->next=NULL;
	r=C;
	for(i=0;i<n;++i){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=a[i];
		r->next=s;
		r=r->next;
	}
	r->next=NULL;
} 

②头插法建立链表

//假设有n个元素存储在数组a中,用头插法建立链表C 
void createlistF(LNode *&C,int a[],int n){
	LNode *s;
	int i;
	C=(LNode*)malloc(sizeof(LNode));
	C->next=NULL;
	for(i=0;i<n;++i){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=a[i];
		s->next=C->next;
		C->next=s;
	}
} 

(2)删除结点
要将单链表的第i个结点删除,必须先在单链表中找到第i-1个结点,再删除其后继结点。如果要删除结点p则完整的删除操作应该是:

q=p->next;
p->next=p->next->next;
free(q);

四、双链表的操作

1.采用尾插法建立双链表

void createDlistR(DLNode *&L,int a[],int n){
	DLNode *s,*r;
	int i;
	L=(DLNode *)malloc (sizeof(DLNode));
	L->prior=NULL;
	L->next=NULL;
	r=L;
	for(i=0;i<n;i++){
		s=(DLNode *)malloc(sizeof(DLNode));
		s->data=a[i];
		r->next=s;
		s->prior=r;
		r=s;
	}
	r->next=NULL;
}

2.查找结点的算法
在双链表中查找第一个值为x的结点,从第一个结点开始,边扫描边比较,若找到这样的结点,则返回结点指针,否则返回NULL,算法代码如下:

DLNode* findNode(DLNode *C,int x){
	DLNode *p=C->next;
	while(p!=NULL){
		if(p->data==x)
		break;
		p=p->next;
	}
	return p;
}

3.插入结点的算法
假设在双链表中p所指的结点之后插入一个结点s,其操作语句如下;

s->next=p->next;
s->prior=p;
p->next=s;
s->next->prior=s;//假如p所指向最后一个结点,则本行可去掉 

4.删除结点的算法

q=p->next;
p->next=q->next;
q->next->prior=p;
free(q);

你可能感兴趣的:(#,线性表——顺序表和链表,指针,算法,链表,数据结构)