链表的建立、遍历、排序、插入、删除等大综合

仅是我自己的一些总结和一些盲点。
盲点在于:
1.没有把(类型一致)这个概念理解。C++ 里面一直强调相同类型才可以做操作,除非进行强制类型转换。我的问题在于没有搞清楚struct nodestruct node *以及int *类型的关系。
2.基本数据类型没有搞清楚。应该是因为上课的缘故,为了便于理解,int *实际上应该被理解成一个int类型的指针,但是我理解成了int *这是一种类型,这种类型叫做整型指针,这个没理解好导致后面一直纠结头结点&指向头结点的指针。
3.单向链表有头指针、头结点、首元结点、尾节点、尾指针等概念。头指针是一个单向链表的充要条件,而头结点是为了方便后续链表的操作一致加上去的,它的数据域可以是任意的。首元结点才是真正有效数据链表的开始。尾节点的指针域一定是NULL,尾指针的作用是为了方便操作后续的链表(这个我一直明白,以后有机会再写)。
4.为什么结点要做成指针类型也就是struct node *?为什么不做成struct node类型?这两种操作有什么区别吗?这个时候要回到指针的本来含义,我们姑且认为指针就是内存地址,命名一个指针,我们可以根据它找到这个地址。
搞清楚了这些概念,那么就可以思路清晰地创建一个链表以及执行后续操作了。

//单向链表的创建、遍历、排序、插入、删除
# include<iostream>
using namespace std;

struct node {
	int data;
	struct node *next;
};

node *creaeList(int n);//创建链表
void *sortList(node *ListHead, int n);
void *traverseList(node *ListHead);
node *insertList(node *listHead, int pos, int val);
node *deleteList(node *listHead, int pos);

int main(){
	int n;//几个结点
	cin >> n >> endl;
	
	struct  node *listHead = NULL;//头指针并初始化
	listHead = creaeList(n);//创建链表

	traverseList(listHead);//链表的遍历
	
	sortList(listHead, n);//链表排序
	
	int pos, val;
	cin >> pos >> val >> endl;
	node *insertList(listHead, pos, val);//链表的插入
	
	cin >> pos >> endl;	
	node *deleteList(listHead, pos);//链表的删除
	
	return 0}

//创建链表
node *creaeList(int n){
	//创建头结点
	node *pHead = new node;
	if(pHead == NULL){
		cout << "error" << endl;
		return -1;
	}
	node *pTail = pHead;//创建尾指针
	pTail->next = NULL;
	
	for(int i = 0; i < n; i++){
		int num;
		cin >> num >> endl;
		
		node *pNew = new node;//创建新的结点
		pNew->data = num;
		pNew->next = NULL;
		pTail->next = pNew;
		pTail = pNew;
	}
	return pHead;
}

//链表的遍历
void *traverseList(node *ListHead){
	node *p = pHead->next; //注意此处
	while(p != NULL){
		cout << p->data << endl;
		p = p->next;
	}
	return ;
}

//链表排序
void node *sortList(node *ListHead, int n){
	node *p, *q;

	for(int i = 0, p = pHead->next; i < n-1 && p != NULL; i++, p = p->next){
		for(int j = i+1, q = p->next; j < n && q != NULL; j++, q = q->next){
			if(p->data > q->data){
				int t = p->data;
				p->data = q->data;
				q->data = t;
			}
		}
	}
	return ;
}

//链表的插入
node *insertList(node *listHead, int pos, int val){
	node *p = pHead;
	int i = 0;
	while(i < pos-1 && p != NULL){//注意i=0开始
		p = p->next;
		i++;
	}
	if(i > pos-1 || p == NULL)
		return false;
	
	node *pNew = new node;
	if(pNew == NULL){
		cout << "error" << endl;
		return -1;
	}
	pNew->data = val;
	pNew->next = p->next;
	p->next = pNew;

	return pHead;
}

//链表的删除
node *deleteList(node *listHead, int pos){
	node *temp = new node;
	if(temp == NULL){
		cout << "error" << endl;
		return -1;
	}
	
	node *p = pHead;
	int i = 0;
	while(i < pos-1 && p->next != NULL){//注意i=0开始
		p = p->next;
		i++;
	}
	if(i > pos-1 || p->next == NULL)
		return false;
	node *q = p->next;
	
	temp->data = q->data;
	temp->next = NULL;
	
	p->next = q->next;
	
	free(temp);
	
	return pHead;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值