自己最近学习数据结构程序的实现【陆续更新】

今天下午花了2小时候左右把王道书上关于数据结构单链表部分的代码自己实现了一下,作此记录

顺序表之前已经实现了有空分享

很多函数还有很多其他的方法实现,欢迎补充,也接受批评。

具体代码如下

#include<stdio.h>
#include <stdlib.h>

/*
下面是关于带头结点的单链表操作
陈阳阳
2020年5月25日17:42:12
*/
typedef struct LNode {
	int data;
	struct LNode *next;
}LNode,*LinkList;

LinkList List_HeadInsert(LinkList &L);
LinkList List_TailInsert(LinkList &L);
LNode *GetElem(LinkList L,int i);
LNode *LocateElem(LinkList L,int i);
bool ListInsert1(LinkList &L,int i,int x);
bool ListInsert2(LNode *p,int x);
bool List_Delete(LinkList &L,int i,int &e);
int Length(LinkList L);
void List_ShowList(LinkList L);

void main(void) {//有各种测试
	//头插法和尾插法创建并初始化链表
	//LinkList L = List_HeadInsert(L);//创建一个struct LNode *类型的指针,并使用头插法初始化链表
	LinkList L1 = List_TailInsert(L1);//使用尾插法初始化链表
	//List_ShowList(L);
	List_ShowList(L1);

	//查找L1中第二个结点数据域中存放的数据并输出
	LNode * p = GetElem(L1,2);
	printf("查找结点中的数字为:%d\n",p->data);

	//查找L1中数据域为1的第一个结点p1
	//LNode * p1 = LocateElem(L1,1);	

	//在链表L1的第3个位置插入一个数据域为5的结点,并打印输出链表中的所有元素
	ListInsert1(L1,3,5);
	List_ShowList(L1);

	//查找L1中数据域为1的第一个结点p1,并在p1结点之前插入一个数据域为9的新结点,并输出插入完之后的链表
	LNode * p1 = LocateElem(L1,1);
	ListInsert2(p1,9);
	List_ShowList(L1);

	//输出经过如上操作后表L1的长度
	printf("表的长度为:%d\n",Length(L1));

	//删除单链表L1中第3个位置的结点,并返回对应的值
	int e;
	List_Delete(L1,3,e);
	printf("所删除的结点中数据域的值为:%d\n",e);
	List_ShowList(L1);
}

LinkList List_HeadInsert(LinkList &L) { //头插法,附带结点初始化
	LNode *s;	//指向新结点的指针
	int x;		//需要插入的数字
	L = (LinkList)malloc(sizeof(LNode));//创建头结点
	L->next = NULL; //初始化为空的单链表
	printf("请输入插入的数字");
	scanf("%d",&x); //输入想要插入的数字
	while(x != 9999) {
		s = (LNode *)malloc(sizeof(LNode));//创建一个新结点来存放数字
		s->data = x; //存入数字
		s->next = L->next; 
		L->next = s; //头插,注意上面两句顺序不能够颠倒互换
		printf("请继续输入数字");
		scanf("%d",&x); //继续输入数字
	}
	return L;
}

LinkList List_TailInsert(LinkList &L) {
	int x;//需要插入的数字
	L = (LinkList)malloc(sizeof(LNode));//创建头结点
	LNode *s,*r = L; //指针s指向的是新的结点,r指针则指向尾结点(一开始是指向L的因为此时链表只有一个头结点)
	printf("请输入插入的数字");
	scanf("%d",&x);
	while(x != 9999) {
		s = (LNode *)malloc(sizeof(LNode));//创建一个新结点来存放数字
		s->data = x;//将x存入新结点的数据域中
		r->next = s;
		r = s;
		printf("请继续输入数字");
		scanf("%d",&x);
	}
	r->next = NULL;
	return L;
}

LNode *GetElem(LinkList L,int i) {//输入一个序号 查找该序号节点的值
	int j = 1;//用于计数,初始值为1
	LNode * p = L->next;//创建一个指针P指向头结点后的第一个结点
	//判断输入的i是否合法
	if(i == 0)
		return L; //返回头结点
	if(i < 1)
		return NULL;
	while(p!=NULL && j<i) { //当P指向的结点不为空的时,开始寻找第i个结点
		p = p->next;
		j++;
	}
	return p;
}

LNode *LocateElem(LinkList L,int i) {//输入一个值查找该值对应的第一个结点
	LNode *p = L->next;
	while(p!=NULL && p->data!=i) {
	p = p->next;
	}
	return p;
}


bool ListInsert1(LinkList &L,int i,int x) {//在链表第i个结点处(第i-1个结点后)入一个新结点,结点的数据域值为x
	//判断i是否合法
	if(i < 1)
		return false;
	LNode * p = GetElem(L,i-1);//直接调用函数找到i-1个结点p
	LNode * s = (LNode *)malloc(sizeof(LNode));//创建一个s指针指向新开辟的结点
	s->data = x;
	s->next = p->next;
	p->next = s;
	return true;
}

bool ListInsert2(LNode *p,int x) {//在结点p前插入一个数据域为x的新结点
	LNode *s = (LNode *)malloc(sizeof(LNode));//创建一个指针s指向新开辟的结点
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data =x;//上面代码的含义实际上是将s结点插入到p节点之后,把p的数据域中的值和s数据域中的值调换了位置
	return true;
}

bool List_Delete(LinkList &L,int i,int &e) {//删除表第i个结点p,并将p数据域中的值返回
	//GetElem函数是返回链表第i个位置的结点,将这个结点的值赋给e
	LNode *p = GetElem(L,i);
	LNode *q = p->next;//q为p的下一个结点,数据域交换完毕之后删除q
	e = p->data;
	p->data = q->data;//将p结点后面结点的数据域赋值给要删除结点的数据域
	p->next = q->next;//将p结点的指针域指向下一个结点指针域所指向的地方
	free(q);//删除结点
	return true;
}

int Length(LinkList L) {//求表的长度
	int len = 0;//用于计数,初始为0
	LNode *p = L;//指针p指向头结点
	while(p->next!=NULL) {
		p = p->next;
		len++;
	}
	return len;
}

void List_ShowList(LinkList L) { //正向输出链表中的数值
	LNode * s = L->next;//让S指针指向头结点的后一个结点
	printf("链表中的数据为:\n");
	while(s != NULL) {
		printf("%d ",s->data);s
		s = s->next;
	}
	printf("\n");//为了输出整洁而加
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值