0
点赞
收藏
分享

微信扫一扫

数据结构与算法分析----单链表

夏天的枫_ 2022-02-22 阅读 87

61.耶斯莫拉

#include"stdafx.h"
#include<assert.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef int ElemType;

typedef struct ListNode{
	ElemType data;
	struct ListNode *next;
}LinkNode,*LinkList;
//购买节点
ListNode *BuyNode(){
	ListNode *s = (ListNode *)malloc(sizeof(ListNode));
	if (s == NULL) exit(1);
	memset(s, 0, sizeof(ListNode));
	return s;
}
//释放节点
void FreeNode(ListNode *s){
	free(s);
}
//初始化单链表
ListNode *Init_LinkList(){
	ListNode *s = BuyNode();
	s->next = NULL;
	return s;
}
//打印链表
void PrintList(LinkList L){
	assert(L != NULL);
	ListNode *p=L->next ;
	while (p != NULL){
		cout << p->data << "   ";
		p = p->next;
	}
	cout << endl;
}
//查询链表
ListNode  * FindValue(LinkList L,ElemType val){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		if (p->data == val){
			return p;
		}
		p = p->next;
	}
	return NULL;
}
//返回当前节点的前一个节点
ListNode  * FindValue_Prev(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *prev = L;
	ListNode *p = L->next;
	while (p != NULL&&p->data != val){
		prev = p;
		p = p->next;
	}
	if (p == NULL){
		prev = NULL;

	}
	return prev;
}

//按位置查询节点
ListNode  *FindValue_index(LinkList L, int  pos){
	assert(L != NULL);
	ListNode *p = L->next;
	int i = 1;
	if (pos <= 0){
		cout << "位置信息不合法!" << endl;
		return NULL;
	}
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	return p;

}

//按位置查询前驱节点
ListNode  *FindValue_Prev_index(LinkList L, int  pos){
	assert(L != NULL);
	int i = 1;
	if (pos < 1)  return NULL;
	ListNode *p = L->next;
	ListNode *prev = L;
	while (p != NULL&&i < pos){
		prev = p;
		p = p->next;
		i++;
	}
	if (p == NULL){//这一步不可省略呀!!
		prev = NULL;
	}
	return prev;
}

//在指定节点插入元素
bool Insert_Next(LinkList L, ListNode *ptr, ElemType val){
	assert(ptr != NULL);
	if (ptr == NULL)  return false;
	LinkNode *r; 
	r = BuyNode();

	r->data = val;
	r->next = ptr->next;
	ptr->next = r;
	return true;
}
//头插法
void Push_Front(LinkList L, ElemType val){
	assert(L != NULL);
	Insert_Next(L,L, val);
}
//尾插法
void Push_Back(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p;
	p = L;
	while (p->next != NULL){
		p = p->next;
	}
	Insert_Next(L, p, val);
	
}
///
int main(){
	ListNode *head = Init_LinkList();
	for (int i = 0; i < 15; i++){
		Push_Back(head, i);
	}
	PrintList(head);
	
}

2.妈的  爷自己写的有这么不堪吗  非得debug滴这么久  算了  上代码!

#include"stdafx.h"
#include<assert.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef int ElemType;

typedef struct ListNode{
	ElemType data;
	struct ListNode *next;
}LinkNode,*LinkList;
//购买节点
ListNode *BuyNode(){
	ListNode *s = (ListNode *)malloc(sizeof(ListNode));
	if (s == NULL) exit(1);
	memset(s, 0, sizeof(ListNode));
	return s;
}
//释放节点
void FreeNode(ListNode *s){
	free(s);
}
//初始化单链表
ListNode *Init_LinkList(){
	ListNode *s = BuyNode();
	s->next = NULL;
	return s;
}
//打印链表
void PrintList(LinkList L){
	assert(L != NULL);
	ListNode *p=L->next ;
	while (p != NULL){
		cout << p->data << "   ";
		p = p->next;
	}
	cout << endl;
}
//查询链表
ListNode  * FindValue(LinkList L,ElemType val){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		if (p->data == val){
			return p;
		}
		p = p->next;
	}
	return NULL;
}
//返回当前节点的前一个节点
ListNode  * FindValue_Prev(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *prev = L;
	ListNode *p = L->next;
	while (p != NULL&&p->data != val){
		prev = p;
		p = p->next;
	}
	if (p == NULL){
		prev = NULL;

	}
	return prev;
}

//按位置查询节点
ListNode  *FindValue_index(LinkList L, int  pos){
	assert(L != NULL);
	ListNode *p = L->next;
	int i = 1;
	if (pos <= 0){
		cout << "位置信息不合法!" << endl;
		return NULL;
	}
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	return p;

}

//按位置查询前驱节点
ListNode  *FindValue_Prev_index(LinkList L, int  pos){
	assert(L != NULL);
	int i = 1;
	if (pos < 1)  return NULL;
	ListNode *p = L->next;
	ListNode *prev = L;
	while (p != NULL&&i < pos){
		prev = p;
		p = p->next;
		i++;
	}
	if (p == NULL){//这一步不可省略呀!!
		prev = NULL;
	}
	return prev;
}

//在指定节点插入元素
bool Insert_Next(LinkList L, ListNode *ptr, ElemType val){
	assert(ptr != NULL);
	if (ptr == NULL)  return false;
	LinkNode *r; 
	r = BuyNode();

	r->data = val;
	r->next = ptr->next;
	ptr->next = r;
	return true;
}
//头插法
void Push_Front(LinkList L, ElemType val){
	assert(L != NULL);
	Insert_Next(L,L, val);
}
//尾插法
void Push_Back(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p;
	p = L;
	while (p->next != NULL){
		p = p->next;
	}
	Insert_Next(L, p, val);
	
}
//在指定位置插入节点
bool Insert_Pos(LinkList L, int pos, int val){
	assert(L != NULL);
	if (pos < 1) return false;
	int i = 1;
	ListNode *p; 
	p = L;
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	if (p != NULL){
		Insert_Next(L, p, val);
		return true;
	}
	else if (p == NULL&&i + 1 == pos){
		Insert_Next(L, p, val);
		return true;
	}
	else{
		cout << "插入位置不合法!" << endl;
		return false ;
	}

} 
//删除单链表中的元素
bool Delete_List(LinkList L, ListNode *ptr){
	assert(L != NULL);
	if (ptr == NULL)  return false;
	ptr->next = ptr->next->next;
	return true;
}
//从头部删除单链表的元素
void Pop_Front(LinkList L){
	assert(L != NULL);
	ListNode *p = L;
	if (p!= NULL){
		Delete_List(L, p);
	}
	else cout << "链表为空!" << endl;
}
//单链表尾删法
void Pop_Back(LinkList L){
	assert(L != NULL);
	ListNode *p = L->next,*s=L;
	ListNode *pre = L;
	while (p->next != NULL){
		pre = p;
		p = p->next;
	}
	Delete_List(pre, s);
	//free(pre);
}
///
int main(){
	ListNode *head = Init_LinkList();
	
	for (int i = 1; i <= 15; i++){
		Push_Back(head, i);
	}
	PrintList(head);
	Pop_Back(head);
	//Pop_Front(head);
	PrintList(head);
	

	/*
	ListNode  *p = FindValue_index(head, 5);
	cout << p->data << endl;
	ListNode  *p = FindValue(head, 14);
	cout << p->data  << endl;
	while (1){
		int tag, pos, val;
		cout << "请输入插入位置和插入数值" << endl;
		cin >> pos >> val;
		if (val == -1)  break;
		tag=Insert_Pos(head, pos, val);
		PrintList(head);

	}
	*/
	cout << "时光作渡,眉目成书,从此深情不被辜负!" << endl;
}

2.呜呜呜代码丢失了  好惨!

这是临走前打印出来的  羽生结弦 俺爱你

3.昨天代码敲得脑子然乎了  乱写尾插法 现在更新一下改正的错误 并加一个时间复杂度为1的杉树所有值的函数

#include"stdafx.h"
#include<assert.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef int ElemType;

typedef struct ListNode{
	ElemType data;
	struct ListNode *next;
}LinkNode, *LinkList;
//购买节点
ListNode *BuyNode(){
	ListNode *s = (ListNode *)malloc(sizeof(ListNode));
	if (s == NULL) exit(1);
	memset(s, 0, sizeof(ListNode));
	return s;
}
//释放节点
void FreeNode(ListNode *s){
	free(s);
}
//初始化单链表
ListNode *Init_LinkList(){
	ListNode *s = BuyNode();
	s->next = NULL;
	return s;
}
//打印链表
void PrintList(LinkList L){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		cout << p->data << "   ";
		p = p->next;
	}
	cout << endl;
}
//查询链表
ListNode  * FindValue(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		if (p->data == val){
			return p;
		}
		p = p->next;
	}
	return NULL;
}
//返回当前节点的前一个节点
ListNode  * FindValue_Prev(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *prev = L;
	ListNode *p = L->next;
	while (p != NULL&&p->data != val){
		prev = p;
		p = p->next;
	}
	if (p == NULL){
		prev = NULL;

	}
	return prev;
}

//按位置查询节点
ListNode  *FindValue_index(LinkList L, int  pos){
	assert(L != NULL);
	ListNode *p = L->next;
	int i = 1;
	if (pos <= 0){
		cout << "位置信息不合法!" << endl;
		return NULL;
	}
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	return p;

}

//按位置查询前驱节点
ListNode  *FindValue_Prev_index(LinkList L, int  pos){
	assert(L != NULL);
	int i = 1;
	if (pos < 1)  return NULL;
	ListNode *p = L->next;
	ListNode *prev = L;
	while (p != NULL&&i < pos){
		prev = p;
		p = p->next;
		i++;
	}
	if (p == NULL){//这一步不可省略呀!!
		prev = NULL;
	}
	return prev;
}

//在指定节点插入元素
bool Insert_Next(LinkList L, ListNode *ptr, ElemType val){
	assert(ptr != NULL);
	if (ptr == NULL)  return false;
	LinkNode *r;
	r = BuyNode();

	r->data = val;
	r->next = ptr->next;
	ptr->next = r;
	return true;
}
//头插法
void Push_Front(LinkList L, ElemType val){
	assert(L != NULL);
	Insert_Next(L, L, val);
}
//尾插法
void Push_Back(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p;
	p = L;
	while (p->next != NULL){
		p = p->next;
	}
	Insert_Next(L, p, val);

}
//在指定位置插入节点
bool Insert_Pos(LinkList L, int pos, int val){
	assert(L != NULL);
	if (pos < 1) return false;
	int i = 1;
	ListNode *p;
	p = L;
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	if (p != NULL){
		Insert_Next(L, p, val);
		return true;
	}
	else if (p == NULL&&i + 1 == pos){
		Insert_Next(L, p, val);
		return true;
	}
	else{
		cout << "插入位置不合法!" << endl;
		return false;
	}

}
//删除单链表中的元素
bool Delete_List(LinkList L, ListNode *ptr){
	assert(L != NULL);
	if (ptr == NULL)  return false;
	ptr->next = ptr->next->next;
	return true;
}
//从头部删除单链表的元素
void Pop_Front(LinkList L){
	assert(L != NULL);
	ListNode *p = L;
	if (p != NULL){
		Delete_List(L, p);
	}
	else cout << "链表为空!" << endl;
}
//单链表尾删法
void Pop_Back(LinkList L){
	assert(L != NULL);
	ListNode *p = L->next, *s = L;
	ListNode *pre = L;
	while (p->next != NULL){
		pre = p;
		p = p->next;
	}
	Delete_List(L,pre);
	//free(pre);
}
void Swap(ElemType *a, ElemType *b){
	ElemType tmp= *a;
	*a = *b;
	*b = tmp;
}
//时间复杂度为O(1)的算法  删除所以值相等的元素
void Delete_All(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p = L->next, *pre = L;
	while (p != NULL){
		if (p->data != val){
			pre = pre->next;
			Swap(&(pre->data), &(p->data));
		}
		p = p->next;
	}
	while (pre->next != NULL) {
		Pop_Back(L);
	}
}

///
int main(){
	ListNode *head = Init_LinkList();
	ElemType arr[] = { 1, 23, 1, 45, 12, 456, 13};
	for (int i = 0; i < 7; i++){
		Push_Back(head, arr[i]);
	}
	PrintList(head);
	Delete_All(head, 12);
	PrintList(head);


	/*
	ListNode  *p = FindValue_index(head, 5);
	cout << p->data << endl;
	ListNode  *p = FindValue(head, 14);
	cout << p->data  << endl;
	while (1){
	int tag, pos, val;
	cout << "请输入插入位置和插入数值" << endl;
	cin >> pos >> val;
	if (val == -1)  break;
	tag=Insert_Pos(head, pos, val);
	PrintList(head);

	}
	*/
	cout << "时光作渡,眉目成书,从此深情不被辜负!" << endl;
}

3.好啦 带头节点的单链表操作就到此为止啦!

#include"stdafx.h"
#include<assert.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef int ElemType;

typedef struct ListNode{
	ElemType data;
	struct ListNode *next;
}LinkNode, *LinkList;
//购买节点
ListNode *BuyNode(){
	ListNode *s = (ListNode *)malloc(sizeof(ListNode));
	if (s == NULL) exit(1);
	memset(s, 0, sizeof(ListNode));
	return s;
}
//释放节点
void FreeNode(ListNode *s){
	free(s);
}
//初始化单链表
ListNode *Init_LinkList(){
	ListNode *s = BuyNode();
	s->next = NULL;
	return s;
}
//打印链表
void PrintList(LinkList L){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		cout << p->data << "   ";
		p = p->next;
	}
	cout << endl;
}
//查询链表
ListNode  * FindValue(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p = L->next;
	while (p != NULL){
		if (p->data == val){
			return p;
		}
		p = p->next;
	}
	return NULL;
}
//返回当前节点的前一个节点
ListNode  * FindValue_Prev(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *prev = L;
	ListNode *p = L->next;
	while (p != NULL&&p->data != val){
		prev = p;
		p = p->next;
	}
	if (p == NULL){
		prev = NULL;

	}
	return prev;
}

//按位置查询节点
ListNode  *FindValue_index(LinkList L, int  pos){
	assert(L != NULL);
	ListNode *p = L->next;
	int i = 1;
	if (pos <= 0){
		cout << "位置信息不合法!" << endl;
		return NULL;
	}
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	return p;

}

//按位置查询前驱节点
ListNode  *FindValue_Prev_index(LinkList L, int  pos){
	assert(L != NULL);
	int i = 1;
	if (pos < 1)  return NULL;
	ListNode *p = L->next;
	ListNode *prev = L;
	while (p != NULL&&i < pos){
		prev = p;
		p = p->next;
		i++;
	}
	if (p == NULL){//这一步不可省略呀!!
		prev = NULL;
	}
	return prev;
}

//在指定节点插入元素
bool Insert_Next(LinkList L, ListNode *ptr, ElemType val){
	assert(ptr != NULL);
	if (ptr == NULL)  return false;
	LinkNode *r;
	r = BuyNode();

	r->data = val;
	r->next = ptr->next;
	ptr->next = r;
	return true;
}
//头插法
void Push_Front(LinkList L, ElemType val){
	assert(L != NULL);
	Insert_Next(L, L, val);
}
//尾插法
void Push_Back(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p;
	p = L;
	while (p->next != NULL){
		p = p->next;
	}
	Insert_Next(L, p, val);

}
//在指定位置插入节点
bool Insert_Pos(LinkList L, int pos, int val){
	assert(L != NULL);
	if (pos < 1) return false;
	int i = 1;
	ListNode *p;
	p = L;
	while (p != NULL&&i<pos){
		p = p->next;
		i++;
	}
	if (p != NULL){
		Insert_Next(L, p, val);
		return true;
	}
	else if (p == NULL&&i + 1 == pos){
		Insert_Next(L, p, val);
		return true;
	}
	else{
		cout << "插入位置不合法!" << endl;
		return false;
	}

}
//删除单链表中的元素
bool Delete_List(LinkList L, ListNode *ptr){
	assert(L != NULL);
	if (ptr == NULL)  return false;
	ptr->next = ptr->next->next;
	return true;
}
//从头部删除单链表的元素
void Pop_Front(LinkList L){
	assert(L != NULL);
	ListNode *p = L;
	if (p != NULL){
		Delete_List(L, p);
	}
	else cout << "链表为空!" << endl;
}
//单链表尾删法
void Pop_Back(LinkList L){
	assert(L != NULL);
	ListNode *p = L->next, *s = L;
	ListNode *pre = L;
	while (p->next != NULL){
		pre = p;
		p = p->next;
	}
	Delete_List(L,pre);
	//free(pre);
}
void Swap(ElemType *a, ElemType *b){
	ElemType tmp= *a;
	*a = *b;
	*b = tmp;
}
//时间复杂度为O(1)的算法  删除所以值相等的元素
void Delete_All(LinkList L, ElemType val){
	assert(L != NULL);
	ListNode *p = L->next, *pre = L;
	while (p != NULL){
		if (p->data != val){
			pre = pre->next;
			Swap(&(pre->data), &(p->data));
		}
		p = p->next;
	}
	while (pre->next  != NULL) {
		Pop_Back(L);
	}
}
//清除函数--->只剩头节点
void ClearList(LinkList L){
	ListNode *p =L;
	while (p->next != NULL){
		Pop_Back(L);
	}
}
//摧毁函数--->头节点也清空
void DestoryList(LinkList L){
	assert(L != NULL);
	ClearList(L);

	free(L);
	cout << "破坏成功!" << endl;
}
///
int main(){
	ListNode *head = Init_LinkList();
	ListNode *p = head->next;
	ElemType arr[] = { 1, 23, 1, 45, 12, 456, 13};
	for (int i = 0; i < 7; i++){
		Push_Back(head, arr[i]);
	}
	PrintList(head);
	ClearList(head);
	cout << p;
	PrintList(head);


	/*
	ListNode  *p = FindValue_index(head, 5);
	cout << p->data << endl;
	ListNode  *p = FindValue(head, 14);
	cout << p->data  << endl;
	while (1){
	int tag, pos, val;
	cout << "请输入插入位置和插入数值" << endl;
	cin >> pos >> val;
	if (val == -1)  break;
	tag=Insert_Pos(head, pos, val);
	PrintList(head);

	}
	*/
	cout << "时光作渡,眉目成书,从此深情不被辜负!" << endl;
}
举报

相关推荐

0 条评论