链式存储结构的基本操作

基本上基础的封装操作都写到了

合并交集并集等做到题就写

#include <stdio.h>
#include <stdlib.h>//C语言动态内存分配所需的头文件
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int State;
typedef int ElemType;
//单链表结点的存储结构
typedef struct LNode {
	ElemType data;
	struct LNode *next;

}LNode,*LinkList;
//两者都是类型,前者表示节点,后者LinkList为指向结构体Lnode的指针类型
//Lnode *p;与LinkList p;两者代表相同的含义都为指向一个节点的指针
//定义链表L:LinkList L,**指向头节点的指针即代表整个链表**

//初始化单链表
State InitLinkList(LinkList *L) { //LinkList *L这里作为头结点与LinkList L作为整个链表加以区分
	*L = (LinkList)malloc(sizeof(LNode));//L=new LNode;
	if (!*L) return ERROR;
	else return OK;
	(*L)->data = NULL;

}

//判断单链表是否为空
State IsEmpty(LinkList L) {
	if (L->next) return FALSE;
	else return TRUE;
	 
}

//获得单链表的长度
State ListLength(LinkList L) {
	int i = 0;//计数器i
	LinkList p;
	p = L->next;//首元节点
	while (p){
		i++;
		p = p->next;
	}
	return i;

}

//单链表的插入
State InsertList(LinkList *L, int i, ElemType e) {//i为插入位置,e为插入元素
	LinkList p;
	p = *L;//临时节点p指向头节点
	int j = 1;
	while (p && j< i-1){//p向后遍历查找
		p = p->next;
		j++;
	}
	if (!p) return ERROR;//到结束都无法找到j=i-1,p已经消失
	LinkList q;//引入新节点q数据域存储e并插入i位置
	q = (LinkList)malloc(sizeof(LNode));
	q->data = e;
	q->next = p->next;
	p->next = q;
	return OK;

}

//单链表的删除
State DeleteList(LinkList *L, int i, ElemType e) {//同插入说明e为删除元素
	LinkList p;
	p = *L;//临时节点p指向头节点
	int j = 1;
	while (p && j < i-1) {// p向后遍历查找到第i-1个
		p = p->next;
		j++;
	}
	if (!p) return ERROR;//到结束都无法找到j=i-1
	LinkList q;
	q = p->next;
	p->next = q->next;//p的下一个即为删除元素直接跳过指针连入下一个
	e = q->data;//备份使用
	free(q);
	return OK;

}

//单链表中元素的查找
State GetElem(LinkList L, int i, ElemType e) {
	LinkList p;
	p = L ->next;
	int j = 1;
	while (p && j<i-1){
		p = p->next;
		j++;
	}
	if (!p) return ERROR;
	e = p->data;//成功查找到赋给e
	return i - 1;//所在下标的位置

}

//单链表的创建(头插法)
State HeadCreatList(LinkList *L) {
	*L = (LinkList)malloc(sizeof(LNode));//为头结点分配内存
	(*L)->next = NULL;//其指针域为空
	for (int i = 1; i <= 9; i++){
		LinkList p = (LinkList)malloc(sizeof(LNode));//新建节点p并为其分配内存
		p->data = i;//数据域一一赋值
		p->next = (*L)->next;
		(*L)->next = p;//先一后二经典操作
    }
	return OK;

}

//单链表的创建(尾插法)
State TailCreatList(LinkList* L) {
	*L = (LinkList)malloc(sizeof(LNode));
	LinkList t;//临时节点以表示尾指针
	t = (*L);
	for (int i = 5; i < 14; i++) {
		LinkList p = (LinkList)malloc(sizeof(LNode));//新建节点p并为其分配内存
		p->data = i;
		t->next = p;
		t = p;//尾指针指向新节点并将新节点作为新的尾指针
		t->next = NULL;//循环结束后指向空
		return OK;

	}
}

//单链表的打印
State PrintLinkList(LinkList L){
	LinkList p;
	p = L->next;
	int i = 1;
	while (p){
		printf("第%d个结点的元素值为%d\n", i, p->data);
		i++;
	}
	return OK;
	
	}

int main() {
	LinkList L1,L2;
	int e;
	printf("使用头插法创建单链表可得结果为L1:\n");
	HeadCreatList(&L1);
	printLinkList(L1);
	printf("使用尾插法创建单链表可得结果为L2: \n");
	TailCreatList(&L2);
	printLinkList(L2);
	printf("其中L1的长度为%d,L2的长度为%d\n", ListLength(L1), ListLength(L2));
	printf("向单链表L1的第三个位置插入一个666元素可得: \n");
	InsertList(&L1, 3, 666);
	printLinkList(L1);
	printf("将单链表L2的第三个元素删除可得: \n");
	DeleteList(&L2, 3, &e);
	printf("删除的元素为:%d\n", e);
	printf("现在的单链表L2为:\n");
	printLinkList(L2);
	printf("单链表是否存在元素666?存在则返回其位置,不存在则返回0:\n");
	printf("单链表L1中666元素的位置为:%d\n", GetElem(L1, 666));
	printf("单链表L2中666元素的位置为:%d\n", GetElem(L2, 666));
	printLinkList(L1);

}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值