数据结构-线性表操作

1、顺序存储


#include "stdio.h"  
#include<stdlib.h>
//#include "stdlib.h"   
//#include "io.h"  
//#include "math.h"  
//#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;          /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;        /* ElemType类型根据实际情况而定,这里假设为int */


Status visit(ElemType c)
{
	printf("%d ", c);
	return OK;
}

typedef struct
{
	ElemType data[MAXSIZE];        /* 数组,存储数据元素 */
	int length;                                /* 线性表当前长度 */
}SqList;

/* 初始化顺序线性表 */
Status InitList(SqList *L)
{
	L->length = 0;
	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(SqList L)
{
	if (L.length == 0)
		return TRUE;
	else
		return FALSE;
}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(SqList *L)
{
	L->length = 0;
	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L)
{
	return L.length;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L, int i, ElemType *e)
{
	if (L.length == 0 || i<1 || i>L.length)
		return ERROR;
	*e = L.data[i - 1];

	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(SqList L, ElemType e)
{
	int i;
	if (L.length == 0)
		return 0;
	for (i = 0; i<L.length; i++)
	{
		if (L.data[i] == e)
			break;
	}
	if (i >= L.length)
		return 0;

	return i + 1;
}


/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqList *L, int i, ElemType e)
{
	int k;
	if (L->length == MAXSIZE)  /* 顺序线性表已经满 */
		return ERROR;
	if (i<1 || i>L->length + 1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */
		return ERROR;

	if (i <= L->length)        /* 若插入数据位置不在表尾 */
	{
		for (k = L->length - 1; k >= i - 1; k--)  /* 将要插入位置之后的数据元素向后移动一位 */
			L->data[k + 1] = L->data[k];
	}
	L->data[i - 1] = e;          /* 将新元素插入 */
	L->length++;

	return OK;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(SqList *L, int i, ElemType *e)
{
	int k;
	if (L->length == 0)               /* 线性表为空 */
		return ERROR;
	if (i<1 || i>L->length)         /* 删除位置不正确 */
		return ERROR;
	*e = L->data[i - 1];
	if (i<L->length)                /* 如果删除不是最后位置 */
	{
		for (k = i; k<L->length; k++)/* 将删除位置后继元素前移 */
			L->data[k - 1] = L->data[k];
	}
	L->length--;
	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{
	int i;
	for (i = 0; i<L.length; i++)
		visit(L.data[i]);
	printf("\n");
	return OK;
}

void unionL(SqList *La, SqList Lb)
{
	int La_len, Lb_len, i;
	ElemType e;
	La_len = ListLength(*La);
	Lb_len = ListLength(Lb);
	for (i = 1; i <= Lb_len; i++)
	{
		GetElem(Lb, i, &e);
		if (!LocateElem(*La, e))
			ListInsert(La, ++La_len, e);
	}
}

int main()
{

	SqList L;
	SqList Lb;

	ElemType e;
	Status i;
	int j, k;
	i = InitList(&L);
	printf("初始化L后:L.length=%d\n", L.length);
	for (j = 1; j <= 5; j++)
		i = ListInsert(&L, 1, j);
	printf("在L的表头依次插入1~5后:L.data=");
	ListTraverse(L);

	printf("L.length=%d \n", L.length);
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	i = ClearList(&L);
	printf("清空L后:L.length=%d\n", L.length);
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	for (j = 1; j <= 10; j++)
		ListInsert(&L, j, j);
	printf("在L的表尾依次插入1~10后:L.data=");
	ListTraverse(L);

	printf("L.length=%d \n", L.length);

	ListInsert(&L, 1, 0);
	printf("在L的表头插入0后:L.data=");
	ListTraverse(L);
	printf("L.length=%d \n", L.length);

	GetElem(L, 5, &e);
	printf("第5个元素的值为:%d\n", e);
	for (j = 3; j <= 4; j++)
	{
		k = LocateElem(L, j);
		if (k)
			printf("第%d个元素的值为%d\n", k, j);
		else
			printf("没有值为%d的元素\n", j);
	}


	k = ListLength(L); /* k为表长 */
	for (j = k + 1; j >= k; j--)
	{
		i = ListDelete(&L, j, &e); /* 删除第j个数据 */
		if (i == ERROR)
			printf("删除第%d个数据失败\n", j);
		else
			printf("删除第%d个的元素值为:%d\n", j, e);
	}
	printf("依次输出L的元素:");
	ListTraverse(L);

	j = 5;
	ListDelete(&L, j, &e); /* 删除第5个数据 */
	printf("删除第%d个的元素值为:%d\n", j, e);

	printf("依次输出L的元素:");
	ListTraverse(L);

	//构造一个有10个数的Lb
	i = InitList(&Lb);
	for (j = 6; j <= 15; j++)
		i = ListInsert(&Lb, 1, j);

	unionL(&L, Lb);

	printf("依次输出合并了Lb的L的元素:");
	ListTraverse(L);



	SqList L1, L2;
	i = InitList(&L1);
	for (int j = 1; j <= 10; ++j)
		i = ListInsert(&L1, 1, j);  //一直在第一个位置插入
	ListTraverse(L1);

	i = InitList(&L2);
	for (int j = 1; j <= 10; ++j)
		i = ListInsert(&L2, j, j);
	ListInsert(&L2, 5, 20);
	ListTraverse(L2);

	system("pause");
}

</pre><pre name="code" class="cpp">
#include<stdio.h>
#include<malloc.h>

#define MaxSize 20
typedef int ElemType;

typedef struct
{
	ElemType data[MaxSize];
	int length;
}SqList;

void InitList(SqList *&L);
bool ClearList(SqList *L);
void CreateList(SqList *&L, ElemType a[], int n);
bool ListEmpty(SqList *L);
int ListLength(SqList *L);
bool GetElem(SqList *L, int i, ElemType &e);
int LocateElem(SqList *L, ElemType e);
bool ListInsert(SqList *L, int i, ElemType e);
bool ListDelete(SqList *L, int i, ElemType &e);
void unionL(SqList *La, SqList *Lb);
void DispList(SqList *L);


int main()
{
	SqList *L;
	SqList *Lb;
	SqList *La;
	SqList *L1, *L2;
	ElemType e;
	int i;
	int j, k;

	ElemType x[6] = { 5, 8, 7, 2, 4, 9 };
	int m = sizeof(x) / sizeof(int);
	CreateList(L, x, m);
	printf("L.data=");
	DispList(L);
	printf("L.length=%d\n", L->length);

	InitList(L);
	printf("初始化L后:L.length=%d\n", L->length);

	for (j = 1; j <= 5; j++)
		i = ListInsert(L, 1, j);
	printf("在L的表头依次插入1~5后:L.data=");
	DispList(L);
	printf("L.length=%d \n", L->length);

	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	i = ClearList(L);
	printf("清空L后:L.length=%d\n", L->length);

	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	for (j = 1; j <= 10; j++)
		ListInsert(L, j, j);
	printf("在L的表尾依次插入1~10后:L.data=");
	DispList(L);
	printf("L.length=%d \n", L->length);

	ListInsert(L, 1, 0);
	printf("在L的表头插入0后:L.data=");

	DispList(L);
	printf("L.length=%d \n", L->length);

	GetElem(L, 5, e);
	printf("第5个元素的值为:%d\n", e);
	for (j = 3; j <= 4; j++)
	{
		k = LocateElem(L, j);
		if (k)
			printf("第%d个元素的值为%d\n", k, j);
		else
			printf("没有值为%d的元素\n", j);
	}


	k = ListLength(L); /* k为表长 */
	for (j = k + 1; j >= k; j--)
	{
		i = ListDelete(L, j, e); /* 删除第j个数据 */
		if (i == false)
			printf("删除第%d个数据失败\n", j);
		else
			printf("删除第%d个的元素值为:%d\n", j, e);
	}
	printf("依次输出L的元素:");
	DispList(L);

	j = 5;
	ListDelete(L, j, e); /* 删除第5个数据 */
	printf("删除第%d个的元素值为:%d\n", j, e);

	printf("依次输出L的元素:");
	DispList(L);

	//构造一个有10个数的Lb
	InitList(La);
	for (j = 10; j >=0 ; j--)
		i = ListInsert(La, 1, j);
	
	InitList(Lb);
	for (j = 6; j <= 15; j++)
		i = ListInsert(Lb, 1, j);

	unionL(La, Lb);

	printf("依次输出合并了Lb的La的元素:");
	DispList(La);



	
	InitList(L1);
	for (int j = 1; j <= 10; ++j)
		i = ListInsert(L1, 1, j);  //一直在第一个位置插入
	printf("依次输出L1的元素:");
	DispList(L1);

	InitList(L2);
	for (int j = 1; j <= 10; ++j)
		i = ListInsert(L2, j, j);
	ListInsert(L2, 5, 20);
	printf("依次输出L2的元素:");
	DispList(L2);
}


void InitList(SqList *&L)
{
	L = (SqList *)malloc(sizeof(SqList));
	L->length = 0;
}

bool ClearList(SqList *L)
{
	L->length = 0;
	return true;
}

//数组初始化线性表
void CreateList(SqList *&L, ElemType a[], int n)
{
	
	L = (SqList *)malloc(sizeof(SqList));
	
	for (int i = 0; i < n; ++i)
	{
		L->data[i] = a[i];
	}
	L->length = n;
}

bool ListEmpty(SqList *L)
{
	return bool(!L->length);
}

int ListLength(SqList *L)
{
	return L->length;
}

bool GetElem(SqList *L, int i, ElemType &e)
{
	if (L->length == 0 || i<1 || i>L->length)
		return false;
	else
	{
		e = L->data[i - 1];
		return true;
	}
}

int LocateElem(SqList *L, ElemType e)
{
	int i;
	if (L->length == 0)
		return 0;
	for (i = 0; i < L->length; ++i)
	{
		if (e == L->data[i])
			break;
	}
	if (i >= L->length)
		return 0;
	return i + 1;
}

bool ListInsert(SqList *L, int i, ElemType e)
{
	int j;
	if (L->length == MaxSize || i<1 || i>L->length + 1)
		return false;
	if (i <= L->length)
	{
		for (j = L->length; j > i - 1; --j)
		{
			L->data[j] = L->data[j - 1];
		}
		L->data[i - 1] = e;
	}
	L->data[i - 1] = e;
	L->length++;
	return true;
}

bool ListDelete(SqList *L, int i, ElemType &e)
{
	int k;
	if (L->length == 0 || i<1 || i>L->length)
		return false;
	e = L->data[i - 1];
	if (i < L->length)
	{
		for (k = i; k<L->length; k++)
			L->data[k - 1] = L->data[k];
	}
	L->length--;
	return true;
}
void unionL(SqList *La, SqList *Lb)
{
	int La_len, Lb_len, i;
	ElemType e;
	La_len = ListLength(La);
	Lb_len = ListLength(Lb);
	for (i = 1; i <= Lb_len; i++)
	{
		GetElem(Lb, i, e);
		if (!LocateElem(La, e))
			ListInsert(La, ++La_len, e);
	}
}
void DispList(SqList *L)
{
	for (int i = 0; i < L->length; ++i)
	{
		printf("%d ", L->data[i]);
	}
	printf("\n");
}


 

2、链式存储

#include "stdio.h"    
#include "string.h"
#include "ctype.h"      
#include "stdlib.h"   
#include "io.h"  
#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */


Status visit(ElemType c)
{
	printf("%d ", c);
	return OK;
}

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定义LinkList */

/* 初始化顺序线性表 */
Status InitList(LinkList *L)
{
	*L = (LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
	if (!(*L)) /* 存储分配失败 */
		return ERROR;
	(*L)->next = NULL; /* 指针域为空 */

	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(LinkList L)
{
	if (L->next)
		return FALSE;
	else
		return TRUE;
}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(LinkList *L)
{
	LinkList p, q;
	p = (*L)->next;           /*  p指向第一个结点 */
	while (p)                /*  没到表尾 */
	{
		q = p->next;
		free(p);
		p = q;
	}
	(*L)->next = NULL;        /* 头结点指针域为空 */
	return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(LinkList L)
{
	int i = 0;
	LinkList p = L->next; /* p指向第一个结点 */
	while (p)
	{
		i++;
		p = p->next;
	}
	return i;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L, int i, ElemType *e)
{
	int j;
	LinkList p;		/* 声明一结点p */
	p = L->next;		/* 让p指向链表L的第一个结点 */
	j = 1;		/*  j为计数器 */
	while (p && j<i)  /* p不为空或者计数器j还没有等于i时,循环继续 */
	{
		p = p->next;  /* 让p指向下一个结点 */
		++j;
	}
	if (!p || j>i)
		return ERROR;  /*  第i个元素不存在 */
	*e = p->data;   /*  取第i个元素的数据 */
	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(LinkList L, ElemType e)
{
	int i = 0;
	LinkList p = L->next;
	while (p)
	{
		i++;
		if (p->data == e) /* 找到这样的数据元素 */
			return i;
		p = p->next;
	}

	return 0;
}


/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(LinkList *L, int i, ElemType e)
{
	int j;
	LinkList p, s;
	p = *L;
	j = 1;
	while (p && j < i)     /* 寻找第i个结点 */
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;   /* 第i个元素不存在 */
	s = (LinkList)malloc(sizeof(Node));  /*  生成新结点(C语言标准函数) */
	s->data = e;
	s->next = p->next;      /* 将p的后继结点赋值给s的后继  */
	p->next = s;          /* 将s赋值给p的后继 */
	return OK;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(LinkList *L, int i, ElemType *e)
{
	int j;
	LinkList p, q;
	p = *L;
	j = 1;
	while (p->next && j < i)	/* 遍历寻找第i个元素 */
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i)
		return ERROR;           /* 第i个元素不存在 */
	q = p->next;
	p->next = q->next;			/* 将q的后继赋值给p的后继 */
	*e = q->data;               /* 将q结点中的数据给e */
	free(q);                    /* 让系统回收此结点,释放内存 */
	return OK;
}

/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(LinkList L)
{
	LinkList p = L->next;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n)
{
	LinkList p;
	int i;
	srand(time(0));                         /* 初始化随机数种子 */
	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;                      /*  先建立一个带头结点的单链表 */
	for (i = 0; i<n; i++)
	{
		p = (LinkList)malloc(sizeof(Node)); /*  生成新结点 */
		p->data = rand() % 100 + 1;             /*  随机生成100以内的数字 */
		p->next = (*L)->next;
		(*L)->next = p;						/*  插入到表头 */
	}
}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
	LinkList p, r;
	int i;
	srand(time(0));                      /* 初始化随机数种子 */
	*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
	r = *L;                                /* r为指向尾部的结点 */
	for (i = 0; i<n; i++)
	{
		p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */
		p->data = rand() % 100 + 1;           /*  随机生成100以内的数字 */
		r->next = p;                        /* 将表尾终端结点的指针指向新结点 */
		r = p;                            /* 将当前的新结点定义为表尾终端结点 */
	}
	r->next = NULL;                       /* 表示当前链表结束 */
}

int main()
{
	LinkList L;
	ElemType e;
	Status i;
	int j, k;
	i = InitList(&L);
	printf("初始化L后:ListLength(L)=%d\n", ListLength(L));
	for (j = 1; j <= 5; j++)
		i = ListInsert(&L, 1, j);
	printf("在L的表头依次插入1~5后:L.data=");
	ListTraverse(L);

	printf("ListLength(L)=%d \n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	i = ClearList(&L);
	printf("清空L后:ListLength(L)=%d\n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	for (j = 1; j <= 10; j++)
		ListInsert(&L, j, j);
	printf("在L的表尾依次插入1~10后:L.data=");
	ListTraverse(L);

	printf("ListLength(L)=%d \n", ListLength(L));

	ListInsert(&L, 1, 0);
	printf("在L的表头插入0后:L.data=");
	ListTraverse(L);
	printf("ListLength(L)=%d \n", ListLength(L));

	GetElem(L, 5, &e);
	printf("第5个元素的值为:%d\n", e);
	for (j = 3; j <= 4; j++)
	{
		k = LocateElem(L, j);
		if (k)
			printf("第%d个元素的值为%d\n", k, j);
		else
			printf("没有值为%d的元素\n", j);
	}


	k = ListLength(L); /* k为表长 */
	for (j = k + 1; j >= k; j--)
	{
		i = ListDelete(&L, j, &e); /* 删除第j个数据 */
		if (i == ERROR)
			printf("删除第%d个数据失败\n", j);
		else
			printf("删除第%d个的元素值为:%d\n", j, e);
	}
	printf("依次输出L的元素:");
	ListTraverse(L);

	j = 5;
	ListDelete(&L, j, &e); /* 删除第5个数据 */
	printf("删除第%d个的元素值为:%d\n", j, e);

	printf("依次输出L的元素:");
	ListTraverse(L);

	i = ClearList(&L);
	printf("\n清空L后:ListLength(L)=%d\n", ListLength(L));
	CreateListHead(&L, 20);
	printf("整体创建L的元素(头插法):");
	ListTraverse(L);

	i = ClearList(&L);
	printf("\n删除L后:ListLength(L)=%d\n", ListLength(L));
	CreateListTail(&L, 20);
	printf("整体创建L的元素(尾插法):");
	ListTraverse(L);


	return 0;
}
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef int ElemType;

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node, LinkList;

void InitList(LinkList *&L);
bool ClearList(LinkList *L);
bool ListEmpty(LinkList *L);
int ListLength(LinkList *L);
bool GetElem(LinkList *L, int i, int &e);
int LocateElem(LinkList *L, int &e);
bool ListInsert(LinkList *L, int i, ElemType e);
bool ListDelete(LinkList *L, int i, ElemType &e);
void DispList(LinkList *L);
void CreateListHead(LinkList *&L,int i);
void CreateListTail(LinkList *&L,int i);


int main()
{
	LinkList *L,*L1,*L2;
	ElemType e;
	int i;
	int j, k;
	InitList(L);
	printf("初始化L后:ListLength(L)=%d\n", ListLength(L));
	for (j = 1; j <= 5; j++)
		i = ListInsert(L, 1, j);
	printf("在L的表头依次插入1~5后:L.data=");
	DispList(L);

	printf("ListLength(L)=%d \n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	i = ClearList(L);
	printf("清空L后:ListLength(L)=%d\n", ListLength(L));
	i = ListEmpty(L);
	printf("L是否空:i=%d(1:是 0:否)\n", i);

	for (j = 1; j <= 10; j++)
		ListInsert(L, j, j);
	printf("在L的表尾依次插入1~10后:L.data=");
	DispList(L);

	printf("ListLength(L)=%d \n", ListLength(L));

	ListInsert(L, 1, 0);
	printf("在L的表头插入0后:L.data=");
	DispList(L);
	printf("ListLength(L)=%d \n", ListLength(L));

	GetElem(L, 5, e);
	printf("第5个元素的值为:%d\n", e);
	for (j = 3; j <= 4; j++)
	{
		k = LocateElem(L, j);
		if (k)
			printf("第%d个元素的值为%d\n", k, j);
		else
			printf("没有值为%d的元素\n", j);
	}


	k = ListLength(L); /* k为表长 */
	for (j = k + 1; j >= k; j--)
	{
		i = ListDelete(L, j, e); /* 删除第j个数据 */
		if (i == false)
			printf("删除第%d个数据失败\n", j);
		else
			printf("删除第%d个的元素值为:%d\n", j, e);
	}
	printf("依次输出L的元素:");
	DispList(L);

	j = 5;
	ListDelete(L, j, e); /* 删除第5个数据 */
	printf("删除第%d个的元素值为:%d\n", j, e);

	printf("依次输出L的元素:");
	DispList(L);

	
	CreateListHead(L1, 6);
	printf("依次输出L1的元素:");
	DispList(L1);

	CreateListTail(L2, 6);
	printf("依次输出L2的元素:");
	DispList(L2);
}


void InitList(LinkList *&L)
{
	L = (LinkList *)malloc(sizeof(Node));
	L->next = NULL;
}

bool ClearList(LinkList *L)
{
	LinkList *p, *q;
	p = L->next;
	while (p)
	{
		q = p;
		p = p->next;
		free(q);
	}
	L->next = NULL;
	return true;
}

bool ListEmpty(LinkList *L)
{
	if (L->next)
		return false;
	else
		return true;
}

int ListLength(LinkList *L)
{
	int i = 0;
	LinkList *p = L->next;
	while (p)
	{
		++i;
		p = p->next;
	}

	return i;
}

bool GetElem(LinkList *L, int i, int &e)
{
	int j = 1;
	LinkList *p;
	p = L->next;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (p == NULL)
		return false;
	else
	{
		e = p->data;
		return true;
	}
}

int LocateElem(LinkList *L, int &e)
{
	int i = 1;
	LinkList *p;
	p = L->next;

	while (p)
	{
		if (p->data == e)
			return i;
		p = p->next;
		++i;
	}
	return 0;
}

bool ListInsert(LinkList *L, int i, ElemType e)
{
	int j = 1;
	LinkList *p, *s;
	p = L;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (p == NULL)
		return false;
	s = (LinkList *)malloc(sizeof(Node));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

bool ListDelete(LinkList *L, int i, ElemType &e)
{
	int j = 1;
	LinkList *p, *s;
	p = L;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (p == NULL)
		return false;
	if (!(p->next) || j > i)
		return false;
	s = p->next;
	p->next = s->next;
	e = s->data;
	free(s);
	return true;
}

void DispList(LinkList *L)
{
	LinkList *p = L->next;
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
void CreateListHead(LinkList *&L, int n)
{
	LinkList *p;
	int a[6] = { 1, 2, 3, 4, 5, 6 };
	//srand(time(0));
	L = (LinkList *)malloc(sizeof(LinkList));     //创建头结点
	L->next = NULL;
	for (int i = 0; i<n; i++)
	{
		p = (LinkList *)malloc(sizeof(LinkList));//创建新结点
		p->data = a[i];
		p->next = L->next;            //将*s插在原开始结点之前,头结点之后
		L->next = p;
	}

}
void CreateListTail(LinkList *&L, int n)
{
	LinkList *p,*r;
	int a[6] = { 1, 2, 3, 4, 5, 6 };
	//srand(time(0));
	L = (LinkList *)malloc(sizeof(LinkList));     //创建头结点
	r = L;
	
	for (int i = 0; i<n; i++)
	{
		p = (LinkList *)malloc(sizeof(LinkList));//创建新结点
		p->data = a[i];
		r->next = p;            //将*s插在原开始结点之前,头结点之后
		r = p;
	}
	r->next = NULL;
}


 

3、静态链表

//#include "string.h"
//#include "ctype.h"      
#include "stdio.h"    
#include "stdlib.h"   
//#include "io.h"  
//#include "math.h"  
//#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 1000 /* 存储空间初始分配量 */

typedef int Status;           /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char ElemType;        /* ElemType类型根据实际情况而定,这里假设为char */


Status visit(ElemType c)
{
	printf("%c ", c);
	return OK;
}

/* 线性表的静态链表存储结构 */
typedef struct
{
	ElemType data;
	int cur;  /* 游标(Cursor) ,为0时表示无指向 */
} Component, StaticLinkList[MAXSIZE];


/* 将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,"0"表示空指针 */
Status InitList(StaticLinkList space)
{
	int i;
	for (i = 0; i<MAXSIZE - 1; i++)
		space[i].cur = i + 1;
	space[MAXSIZE - 1].cur = 0; /* 目前静态链表为空,最后一个元素的cur为0 */
	return OK;
}


/* 若备用空间链表非空,则返回分配的结点下标,否则返回0 */
int Malloc_SSL(StaticLinkList space)
{
	int i = space[0].cur;           		/* 当前数组第一个元素的cur存的值 */
	/* 就是要返回的第一个备用空闲的下标 */
	if (space[0].cur)
		space[0].cur = space[i].cur;       /* 由于要拿出一个分量来使用了, */
	/* 所以我们就得把它的下一个 */
	/* 分量用来做备用 */
	return i;
}


/*  将下标为k的空闲结点回收到备用链表 */
void Free_SSL(StaticLinkList space, int k)
{
	space[k].cur = space[0].cur;    /* 把第一个元素的cur值赋给要删除的分量cur */
	space[0].cur = k;               /* 把要删除的分量下标赋值给第一个元素的cur */
}

/* 初始条件:静态链表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(StaticLinkList L)
{
	int j = 0;
	int i = L[MAXSIZE - 1].cur;
	while (i)
	{
		i = L[i].cur;
		j++;
	}
	return j;
}

/*  在L中第i个元素之前插入新的数据元素e   */
Status ListInsert(StaticLinkList L, int i, ElemType e)
{
	int j, k, l;
	k = MAXSIZE - 1;   /* 注意k首先是最后一个元素的下标 */
	if (i < 1 || i > ListLength(L) + 1)
		return ERROR;
	j = Malloc_SSL(L);   /* 获得空闲分量的下标 */
	if (j)
	{
		L[j].data = e;   /* 将数据赋值给此分量的data */
		for (l = 1; l <= i - 1; l++)   /* 找到第i个元素之前的位置 */
			k = L[k].cur;
		L[j].cur = L[k].cur;    /* 把第i个元素之前的cur赋值给新元素的cur */
		L[k].cur = j;           /* 把新元素的下标赋值给第i个元素之前元素的ur */
		return OK;
	}
	return ERROR;
}

/*  删除在L中第i个数据元素   */
Status ListDelete(StaticLinkList L, int i)
{
	int j, k;
	if (i < 1 || i > ListLength(L))
		return ERROR;
	k = MAXSIZE - 1;
	for (j = 1; j <= i - 1; j++)
		k = L[k].cur;
	j = L[k].cur;
	L[k].cur = L[j].cur;
	Free_SSL(L, j);
	return OK;
}

Status ListTraverse(StaticLinkList L)
{
	int j = 0;
	int i = L[MAXSIZE - 1].cur;
	while (i)
	{
		visit(L[i].data);
		i = L[i].cur;
		j++;
	}
	return j;
	printf("\n");
	return OK;
}


int main()
{
	StaticLinkList L;
	Status i;
	i = InitList(L);
	printf("初始化L后:L.length=%d\n", ListLength(L));

	i = ListInsert(L, 1, 'F');
	i = ListInsert(L, 1, 'E');
	i = ListInsert(L, 1, 'D');
	i = ListInsert(L, 1, 'B');
	i = ListInsert(L, 1, 'A');

	printf("\n在L的表头依次插入FEDBA后:\nL.data=");
	ListTraverse(L);

	i = ListInsert(L, 3, 'C');
	printf("\n在L的“B”与“D”之间插入“C”后:\nL.data=");
	ListTraverse(L);

	i = ListDelete(L, 1);
	printf("\n在L的删除“A”后:\nL.data=");
	ListTraverse(L);

	printf("\n");

	return 0;
}
















  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值