int型单链表带头结点,大学基础数据结构

int型单链表带头结点

大学基础数据结构

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10;
typedef int ElemType;
typedef struct LNode {//数据结构定义,结点定义
	ElemType data;//数据
	LNode* next;//指针
}LNode,*LinkList;

bool InitLinkList(LinkList &L) {//创建带头结点
	L = (LNode*)malloc(sizeof(LNode));//带头结点
	if (L == NULL) return false;//创建失败
	else L->next = NULL;//头结点指针域置空
	return true;
}
LNode* GetElem(LinkList L, int i) {//返回第i个结点指针
	if (i < 0)return NULL;
	LNode* p = L;
	for (int j = 0; p!=NULL&&j < i; j++) {
		p = p->next;
	}
	return p;//这里的p可能为NULL
	/*i为1,且表空的时候p为NULL
	当i为NULL的时候p为NULL*/

}

bool InsertNextLNode(LNode* p, ElemType e) {//在p结点后插入结点
	if (p == NULL)return false;
	LNode* s = (LNode*)malloc(sizeof(LNode));//新结点
	s->data = e;//新结点中填入数据

	s->next = p->next;
	p->next = s;
	return true;
}
bool InsertPriorLNode__fun1(LinkList L, LNode* p, ElemType e) {//在结点p的前面插入结点
	LNode* q = L;
	while (q != NULL && q->next != p) {//找到p的前一个结点
		q = q->next;
	}
	if (q == NULL) return false;//说明结点p并不存在
	InsertNextLNode(q, e);//如果结点p存在,则在q后面插入p
}
bool InsertPriorLNode__fun2(LNode* p, ElemType e) {//实际上还是后插但是交换值看起来像前插
	if (p == NULL)return false;//如果p结点是NULL则没有后继结点无法实现
	LNode* s = (LNode*)malloc(sizeof(LNode));//新结点
	s->data = p->data;//新结点数据换为p的数据
	p->data = e;//p结点的数据修改

	s->next = p->next;
	p->next = s;//后插

	return true;
}
bool Insert_i(LinkList& L,int i,ElemType e) {//插入操作,第i个位置上插入元素e
	LNode* p=GetElem(L,i-1);//取第i-1个结点
	InsertNextLNode(p, e);//在i-1结点后插
	return true;
}

bool Delet_i(LinkList& L, int i, ElemType& e) {//按位序删除
	LNode* p=GetElem(L, i-1);//找到i个结点
	if (p == NULL||p->next==NULL)return false;//i是NULL,没有i结点
	LNode* q = p->next;//q是i结点的指针
	e = q->data;//返回i结点的数据
	p->next= q->next;//i-1链接i+1
	free(q);//释放i结点
	//if (i < 1)return false;//i不合法
	//if (L->next == NULL)return false;
	//LNode* p = L;
	//int j = 0;
	//while (p != NULL && j < i-1) {//循环找到i-1个结点
	//	p = p->next;
	//	j++;
	//}
	//if (p == NULL||p->next==NULL)return false;//第i位是NULL或者第i-1位是NULL
}
bool Delet_p(LinkList& L, LNode* p) {//删除指定结点
	LNode* q = L;
	while (q != NULL && q->next != p) {//从表头到表尾
		q = q->next;
	}
	if (q == NULL || q->next == NULL)return false;//说明没有p结点
	q->next = q->next->next;//q指向p->next
	free(p);
	return true;
}
bool Delet_p_fun2(LNode* p) {//数据交换,然后删除p->next,好像删除了p
	if (p == NULL || p -> next == NULL)return false;
	//p == NULL,p->next == NULL这两种情况下都没有p->next结点
	LNode* q = p->next;
	p->data = q->data;

	p->next = q->next;
	//把p的后面结点的数据给p,然后删除p后面的结点,就好像删除了p
	free(q);
}

LinkList List_headInsert(LinkList& L) {
	InitLinkList(L);
	ElemType x;
	scanf("%d", &x);
	while (x!= 9999) {
		InsertNextLNode(L, x);
		scanf("%d", &x);
	}
	return L;
}
int LinkList_len(LinkList L) {
	int i = 0;
	LNode* p = L->next;
	while (p != NULL) {
		p=p->next;
		i++;
	}
	return i;
}

LinkList List_TailInsert(LinkList& L) {//尾插法,时间复杂度为0(n平方)
	InitLinkList(L);
	int x;
	scanf("%d", &x);
	while (x != 9999) {
		int i = LinkList_len(L) + 1;
		Insert_i(L,i,x);
		scanf("%d", &x);
	}
	return L;
}

LinkList List_TailInsert_fun1(LinkList& L) {//带尾指针的尾插法
	InitLinkList(L);
	LNode* r= L;
	int x;
	scanf("%d", &x);
	while (x != 9999) {
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = r->next;
		r->next = s;
		r = s;
		scanf("%d", &x);
	}
	return L;
}


void Print_LinkList(LinkList L) {
	LNode* p = L->next;
	while (p != NULL) {
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

LNode* LocateElem(LinkList L,ElemType e) {//按值查找,找到数据域==e的结点
	LNode* p = L->next;
	while (p != NULL && p->data != e) {
		p = p->next;
	}
	return p;//NULL或数据域==e的结点
}


int main() {
	LinkList L;
	List_TailInsert_fun1(L);
	//List_TailInsert(L);
	//List_headInsert(L);
	Print_LinkList(L);

	/*Insert_i(L, 3, 10001);
	Print_LinkList(L);*/

	/*LNode* p=GetElem(L, 1); 
	InsertNextLNode(p, 4);
	Print_LinkList(L);

	List_headInsert(L);
	Print_LinkList(L);

	InsertPriorLNode__fun1(L,p,6);
	Print_LinkList(L);

	ElemType e;
	Delet_i(L,1,e);
	printf("%d\n", e);
	Print_LinkList(L);

	Delet_p(L,p);
	Print_LinkList(L);*/
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值