仅是我自己的一些总结和一些盲点。
盲点在于:
1.没有把(类型一致)这个概念理解。C++ 里面一直强调相同类型才可以做操作,除非进行强制类型转换。我的问题在于没有搞清楚struct node
和struct 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;
}