数据结构 第二章 线性表

线性表的代码

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define Maxsize 10//静态分配顺序表的最大长度
#define ElemType int
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#include<stdio.h>
#include<stdlib.h>
typedef struct 
{//线性表静态分配顺序存储结构
	ElemType data[Maxsize];//大小无法改变
	int length;//顺序表当前长度
}SeqList;
typedef struct 
{//线性表的动态分配顺序存储结构
	ElemType* elem; //存储空间基址
	int length;//当前长度
	int listsize;//当前分配的存储容量(以sizeof(ElemType))为单位
}SqList;
typedef struct LNode
{//线性表的单链表存储结构
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;
typedef struct DuLNode
{//线性表的双向链表存储结构
	ElemType data;
	struct DuLNode* prior, * next;
}DuLNode,*DuLinkList;

int InitList_Seq(SeqList& L)
{//初始化一个顺序表
	int i;

	for (i = 0; i < Maxsize; i++)
	{//防止脏数据
		L.data[i] = 0;
	}
	L.length = 0;//顺序表初始长度
	return OK;
}
int InitList_Sq(SqList& L)
{//构造一个空的线性表L

	L.elem = (ElemType*)malloc(sizeof(ElemType) * LIST_INIT_SIZE);
	if (!L.elem)
	{
		return OVERFLOW;
	}
	L.length = 0;//顺序表初始长度为0,空表
	L.listsize = LIST_INIT_SIZE;
	return OK;
}
int Increasesize(SqList& L, int len)
{//动态增加顺序表长度
	ElemType* p;
	int i;

	p = L.elem;
	L.elem = (ElemType*)malloc(sizeof(ElemType) * (L.length + len));
	if (!L.elem)
	{//分配失败
		return ERROR;
	}
	for (i = 0; i < L.length; i++)
	{//数据复制
		L.elem[i] = p[i];
	}
	L.listsize = L.length + len;//更新线性表长度
	free(p);//释放辅助空间
	return OK;
}
int Seq_Insert(SeqList& l, int i, ElemType e)
{//在静态分配线性表的第i个位置插入e
	int j;
	if (i<1 || i>l.length+1)
	{
		return FALSE;
	}
	if (l.length >= Maxsize)
	{
		return FALSE;
	}
	for (j = l.length; j >= i; j--)
	{
		l.data[j] = l.data[j - 1];
	}
	l.data[i - 1] = e;
	l.length++;
	return OK;
}
int Sq_Insert(SqList& l, int i,ElemType e)
{//在动态分配线性表的第i个位置插入e
	ElemType* p,* q;
	if (i<1 || i>l.length + 1)
	{
		return FALSE;
	}
	if (l.length >= l.listsize)
	{
		Increasesize(l, LISTINCREMENT);
	}
	q = l.elem + (i - 1);//q指示插入位置
	p = l.elem + (l.length - 1);
	for (; p >= q; --p)
	{//插入元素之后元素后移
		*(p + 1) = *p;

	}
	*q = e;//插入e
	l.length++;
	return OK;
}

int Seq_Delete(SeqList& l, int i, ElemType&  e)
{//在静态分配线性表的第i个位置删除
	int j;
	if (i<0 || i>l.length)
	{
		return FALSE;
	}
	e = l.data[i - 1];
	for (j = i; j < l.length; j++)
	{
		l.data[j - 1] = l.data[j];
	}
	l.length--;
	return OK;
}
int Sq_Delete(SqList& l, int i, ElemType& e)
{//在动态分配线性表的第i个位置删除
	ElemType* p, * q;
	if (i<0 || i>l.length)
	{
		return FALSE;
	}
	p = l.elem + (i - 1);
	e = *p;
	q = l.elem + (l.length - 1);
	for (p++; p <= q; p++)
	{
		*(p - 1) = *p;
	}
	l.length--;
	return OK;
}
int Seq_GetElem(SeqList l, int i, ElemType& e)
{//按位查找静态分配线性表
	if (i<0 || i>l.length)
	{
		return ERROR;
	}
	e = l.data[i - 1];
	return OK;
}
int Sq_GetElem(SqList l, int i, ElemType& e)
{//按位查找动态分配线性表
	if (i<0 || i>l.length)
	{
		return ERROR;
	}
	e = l.elem[i - 1];
	return OK;
}
void Sq_LocateElem(SqList l, int& i, ElemType e)
{//按值查找动态分配线性表
	for (i = 0; i < l.length; i++)
	{
		if (l.elem[i] == e)
			break;
	}
	i = i + 1;
}
int CreateList_L(LinkList& l)
{//逆向建立单链表
	LinkList L;
	ElemType x;

	l = (LinkList)malloc(sizeof(LNode));//头结点
	if (!l)
	{
		return ERROR;
	}
	l->next = NULL;
	printf("逆序输入结点数据,输入999结束");
	scanf_s("%d", &x);
	while (x != 999)
	{
		L = (LinkList)malloc(sizeof(LNode));
		L->next = l->next;
		L->data = x;
		l->next = L;
		scanf_s("%d", &x);
	}
	return TURE;
}
int LinkList_TailInsert(LinkList& l)
{//尾插法创建单链表
	ElemType x;
	LinkList L;
	l = (LinkList)malloc(sizeof(LNode));
	l->next = NULL;
	if (!l)
	{
		return ERROR;
	}
	printf("顺序输入结点数据,输入999结束");
	scanf_s("%d", &x);
	while (x != 999)
	{
		L = (LinkList)malloc(sizeof(LNode));
		L->data = x;
		L->next = NULL;
		l->next = L;
		scanf_s("%d", &x);
	}
	return OK;
}
int GetElem_L(LinkList L, int i, ElemType& e)
{
	int j = 1;//计数器
	LinkList p;
	p = L->next;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)
	{
		return ERROR;
	}
	e = p->data;
	return OK;
}
int ListInsert(LinkList& l, int i, ElemType e)
{
	LNode* p, * s;//p指向当前扫描到的结点
	int j = 0;//当前p指向的是第几个结点
	
	if (i < 1)
	{
		return ERROR;
	}
	p = l;//l指向头结点,头结点是第零个结点(不存结点)
	while (p != NULL && j < i - 1)
	{//循环找到第i-1个结点
		p = p->next;
		j++;
	}
	if (p == NULL || j > i - 1)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}
int Listinsert(LinkList& l, int i, ElemType e)
{
	LinkList p, s;
	int j = 1;
	if (i < 1)
	{
		return ERROR;
	}
	if (i == 1)
	{//插入第一个结点的的操作和其他结点不同
		s = (LinkList)malloc(sizeof(LNode));
		s->data = e;
		s->next = l;
		l = s;
		return OK;
	}
	p = l;
	while (p != NULL && j < i - 1)
	{//循环找到第i-1个结点
		p = p->next;
		j++;
	}
	if (p == NULL || j > i - 1)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}
int ListDelete(LinkList& l, int i, ElemType e)
{
	LNode* p, * q;//p指向当前扫描到的结点
	int j = 0;//当前p指向的是第几个结点

	if (i < 1)
	{
		return ERROR;
	}
	p = l;//l指向头结点,头结点是第零个结点(不存结点)
	while (p != NULL && j < i - 1)
	{//循环找到第i-1个结点
		p = p->next;
		j++;
	}
	if (p == NULL || j > i - 1)
	{
		return ERROR;
	}
	if (p->next == NULL)
	{
		return ERROR;
	}
	q = p->next;//令q指向被删除结点
	e = q->data;
	p->next = q->next;
	free(q);
	return OK;
}
int InitDuLinkList(DuLinkList& l)
{
	l = (DuLinkList)malloc(sizeof(DuLNode));
	if (!l)
	{
		return ERROR;
	}
	l->prior = NULL;
	l->next = NULL;
	return OK;
}
DuLNode *GetElemP_DuL(DuLinkList l, int i)
{
	int j = 1;
	DuLinkList p;
	p = l->next;
	while (j < i)
	{
		p = p->next;
	}
	return p;
}
int ListInsert_Dul(DuLinkList& l, int i, ElemType e)
{
	DuLinkList p, s;
	if (i < 1)
	{
		return ERROR;
	}
	if (!(p = (GetElemP_DuL(l, i))));
	{
		return ERROR;
	}
	s = (DuLinkList)malloc(sizeof(DuLNode));
	if (!s)
	{
		return ERROR;
	}
	s->data = e;
	s->prior = p->prior;
	p->prior->next = s;
	s->next = p;
	p->prior = s;
	return OK;
}
int ListDelete_Dul(DuLinkList& l, int i, ElemType& e)
{
	DuLinkList p, s;
	if (i < 1)
	{
		return ERROR;
	}
	if (!(p = (GetElemP_DuL(l, i))));
	{
		return ERROR;
	}
	e = p->data;
	p->prior->next = p->next;
	p->next->prior = p->prior;
	free(p);
	return OK;
}
int InitList(LinkList& l)
{
	l = (LinkList)malloc(sizeof(LNode));
	if (!l)
	{
		return ERROR;
	}
	l->next = l;
	return OK;
}
int InitDulist(DuLinkList& l)
{
	l = (DuLinkList)malloc(sizeof(DuLNode));
	if (!l)
	{
		return ERROR;
	}
	l->next = l;
	l->prior = l;
	return OK;
}
int main()
{
	SeqList l;//静态分配
	SqList L;//动态分配
	LinkList LL;//单链表
	DuLinkList ll;//双向链表
	int i;
	ElemType e;

	InitList_Seq(l);
	InitList_Sq(L);
	printf("输入在静态分配存储线性表插入位置和插入内容\n");
	scanf_s("%d,%d", &i, &e);
	Seq_Insert(l, i, e);
	printf("输入在静态分配存储线性表删除位置\n");
	scanf_s("%d", &i);
	Seq_Delete(l, i,e);
	printf("输入在动态分配存储线性表插入位置和插入内容\n");
	scanf_s("%d,%d", &i, &e);
	Sq_Insert(L, i, e);
	printf("输入在动态分配存储线性表删除位置\n");
	scanf_s("%d", &i);
	Sq_Delete(L, i, e);
	printf("输入在静态分配存储线性表中查找的位序\n");
	scanf_s("%d", &i);
	Seq_GetElem(l, i, e);
	printf("输入在动态分配存储线性表中查找的位序\n");
	scanf_s("%d", &i);
	Sq_GetElem(L, i, e);
	printf("输入在动态分配存储线性表中查找的内容\n");
	scanf_s("%d", &e);
	Sq_LocateElem(L, i, e);
	printf("头插法建立单链表\n");
	CreateList_L(LL);
	printf("尾插法建立单链表\n");
	LinkList_TailInsert(LL);
	printf("查找单链表的第i个位置\n");
	printf("输入位置i");
	scanf_s("%d", &i);
	GetElem_L(LL, i,e);
	printf("在(带头结点的)单链表第i个位置插入e,输入i和e\n");
	scanf_s("%d,%d", &i, &e);
	ListInsert(LL, i, e);
	printf("在(不带头结点的)单链表第i个位置插入e,输入i和e\n");
	scanf_s("%d,%d", &i, &e);
	Listinsert(LL, i, e);
	printf("在(带头结点的)单链表第i个位置删除e,输入i和e\n");
	scanf_s("%d,%d", &i, &e);
	ListDelete(LL, i, e);
	printf("初始化双向循环链表");
	InitDuLinkList(ll);
	printf("在带头结点的双向链表中第i个位置插入e");
	scanf_s("%d,%d", &i, &e);
	ListInsert_Dul(ll, i, e);
	printf("在带头结点的双向链表中第i个位置删除");
	scanf_s("%d", &i);
	ListDelete_Dul(ll, i, e);
	printf("初始化循环单链表");
	InitList(LL);
	printf("初始化循环双链表");
	InitDulist(ll);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值