王道C语言督学营(数据结构) 第一部分

2.2 顺序表的增删改查

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef  int ElemType;
typedef struct {
	ElemType data[MaxSize];
	int len;
}Sqlist;
int LocateElem(Sqlist L, ElemType e)
{
	int i;
	for (i = 0; i < L.len; i++)
		if (L.data[i] == e)
			return i + 1;
	return 0;
	/*int j = 0;
	while (L.data[j++] == e)
		return j;*/
}
bool ListDelete(Sqlist& L, int i, ElemType& e)
{
	if (i<1 || i>L.len)
		return false;
	if (L.len == 0)
		return 0;
	e = L.data[i];
	for (int j = i; j < L.len; j++)
		L.data[j] = L.data[j + 1];
	L.len--;
	return true;
}
void PrintList(Sqlist& L)
{
	for (int i = 0; i < L.len; i++)
		printf("%4d", L.data[i]);
	printf("\n");
}
bool ListInsert(Sqlist& L, int i, ElemType e)
{
	if (i<0 || i>L.len + 1)//判断要插入的位置是否合法
		return false;
	if (L.len >= MaxSize)//元素存储满了,不能再存了
		return false;
	for (int j = L.len; j >= i; j--)//移动顺序表中的元素,依次往后移动
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;//数组下标从零开始,插入第一个位置,访问的下标是0
	L.len++;
	return true;
}
int main()
{
	Sqlist L;
	bool ret;
	ElemType del;
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.len = 3;
	ret = ListInsert(L, 2, 60);
	if (ret)
	{
		printf("插入成功\n");
		PrintList(L);
	}
	else
	{
		printf("插入失败\n");
	}

	ret = ListDelete(L, 1, del);
	if (ret)
	{
		printf("删除成功\n");
		printf("删除元素值为%d\n", del);
		PrintList(L);
	}
	else
	{
		printf("删除失败\n");
	}

	/*ret = LocateElem(L, 60);
	if (ret)
	{
		printf("查找成功\n");
		printf("元素位置为%d\n", ret);
	}
	else
	{
		printf("查找失败\n");
	}*/
	int elem_pos;
	elem_pos = LocateElem(L, 60);
	if(elem_pos)
	{
		printf("查找成功\n");
		printf("元素位置为%d\n", ret);
	}
	else
	{
		printf("查找失败\n");
	}
	return 0;
}

2.3 线性表的链式表示

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {
	ElemType data;
	struct LNode* next;//指向下一个结点
}LNode,*LinkList;
//头插新建链表
LinkList CreateList1(LinkList& L)
{
	LNode *s; int x;
	L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
	L->next = NULL;//L->data里边没有放东西
	scanf("%d", &x);//从标准输入读取数据
	while (x != 9999) {
		s = (LNode*)malloc(sizeof(LNode));//申请一个新空间给s,强制类型转换
		s->data = x;//把读取到的值,给新空间中的data成员
		s->next = L->next;//让新节点的next指针指向链表的第一个元素
		L->next = s;//让s作为第一个元素
		scanf("%d", &x);
	}
	return L;
}
LinkList CreateList2(LinkList& L)
{
	int x;
	L = (LinkList)malloc(sizeof(LNode));
	LNode* s, * r = L;
	scanf("%d", &x);
	while (x!= 9999)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;//让尾部结点指向新节点
		r = s;//r指向新的表尾结点
		scanf("%d", &x);
	}
	r->next = NULL;
	return L;
}
void PrintList(LinkList L)//没有填引用
{
	L = L->next;//主函数L不变
	while (L != NULL)
	{
		printf("%3d", L->data);//打印当前结点数据
		L = L->next;//指向下一个结点
	}
	printf("\n");
}
//查找第几个结点的值
LinkList GetElem(LinkList& L, int i)
{
	int j = 1;
	LinkList p = L->next;//前提头结点为空   让p指向第一个结点
	if (0 == i)
	{
		return L;
	}
	if (i < 1)
	{
		return NULL;
	}
	while (p && j < i)
	{
		p = p->next;//指向下一个结点
		j++;
	}
	return p;
}
//按值查找
LinkList LocateElem(LinkList L, ElemType e)
{
	LinkList p = L->next;
	while (p != NULL && p->data != e)
	{
		p = p->next;
	}
	return p;
}
//往第i个位置插入元素
bool ListFrontInsert(LinkList L, int i,ElemType e)
{
	LinkList p = GetElem(L, i - 1);
	if (p == NULL)
	{
		return false;
	}
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;//s是s这个结点的首地址
	return true;
}
//删除第i个结点
bool ListDelete(LinkList L, int i)
{
	LinkList p = GetElem(L, i - 1);
	if(NULL == p)
	{
		return false;
	}
	LinkList q = p->next;
	if (NULL == q)
	{
		return false;
	}
	p->next = q->next;//断链
	free(q);//释放对应结点空间
	q = NULL;//为避免野指针
	return true;
}
int main()
{
	LinkList L;//LinkList等价于struct LNode* 链表头,是结构体指针类型
	LinkList search;
	//CreateList1(L);//头插法新建链表
	CreateList2(L);//尾插法新建链表   
	PrintList(L);
	search=GetElem(L, 2);
	if (search != NULL)
	{
		printf("查序列找成功\n");
		printf("%d\n", search->data);
	}
	search = LocateElem(L, 6);
	if (search != NULL)
	{
		printf("查找值成功\n");
		printf("%d\n", search->data);
	}
	ListFrontInsert(L, 2, 99);
	PrintList(L);
	ListDelete(L, 4);
	PrintList(L);
	return 0;
}

2.4 双向链表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode {
	ElemType data;
	struct DNode *prior,* next;//前驱 后继
}DNode, * DLinkList;
//双向链表头插法
DLinkList Dlist_head_insert(DLinkList& DL)
{
	DNode* s; int x;
	DL = (DLinkList)malloc(sizeof(DNode));//带头结点的链表,DL就是头结点
	DL->next = NULL;
	DL->prior = NULL;
	scanf("%d", &x);
	while (x != 9999)
	{
		s = (DLinkList)malloc(sizeof(DNode));//申请一个空间,强制类型转换
		s->data = x;
		s->next = DL->next;
		if (DL->next != NULL)//插入第一个结点时,不需要这一步操作
		{
			DL->next->prior = s;
		}
		s->prior = DL;
		DL->next=s;
		scanf("%d", &x);
	}
	return DL;
}
//双向链表尾插法
DLinkList DList_tail_insert(DLinkList& DL)
{
	int x;
	DL = (DLinkList)malloc(sizeof(DNode));//带头结点的链表
	DNode *s, * r = DL;//r代表尾指针
	DL->prior = NULL;
	//3 4 5 6 7 9999
	scanf("%d", &x);
	while (x != 9999)
	{
		s = (DNode*)malloc(sizeof(DNode));
		s->data = x;
		r->next = s;
		s->prior = r;
		r = s;//r指向新的表尾结点
		scanf("%d", &x);
	}
		r->next = NULL;
		return DL;
}
DNode* GetElem(DLinkList DL, int i)
{
	int j = 1;
	DNode* p = DL->next;
	if (i == 0)
		return DL;
	if (i < 1)
		return NULL;
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	return p;
}
//新节点插入第i个位置
bool DListFrontInsert(DLinkList DL, int i, ElemType e)
{
	DLinkList p = GetElem(DL, i - 1);//找前一个位置的地址;
	if (NULL == p)
	{
		return false;
	}
	DLinkList s = (DLinkList)malloc(sizeof(DNode));//为新插入的结点申请空间
	s->data = e;
	s->next = p->next;
	p->next->prior = s;
	s->prior = p;
	p->next = s;
	return true;
}

//删除第i个结点
bool DListDelete(DLinkList DL, int i)
{
	DLinkList p = GetElem(DL, i - 1);
	if (NULL == p)
	{
		return false;
	}
	DLinkList q;
	q = p->next;
	if (q = NULL)//删除的元素不存在
	{
		return false;
	}
	p->next = q->next;//断链
	if (q->next != NULL)//q->next为NULL删除的是最后一个结点
	{
		q->next->prior = p;
	}
	free(q);
	return true;
}
//链表打印
void PrintDList(DLinkList DL)
{
	DL = DL->next;
	while (DL != NULL)
	{
		printf("%3d", DL->data);
		DL = DL->next;
	}
	printf("\n");
}
int main()
{
	DLinkList DL; 
	DLinkList search;
	//Dlist_head_insert(DL);//头插法
	DList_tail_insert(DL);//尾插法
	PrintDList(DL);
	search = GetElem(DL, 2);
	if (search != NULL)
	{
		printf("按序号查找成功\n");
		printf("%d\n", search->data);
	}
	DListFrontInsert(DL, 3, 99);
	PrintDList(DL);
	DListDelete(DL, 2);
	PrintDList(DL);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值