复习数据结构,本来题目是删除具有x值的结点,但是不先创建链表,哪来的删呢?所以花了一上午折腾怎么生成无头结点的链表(有头结点书上有)这里就贴出来我struggle出来的成果
- 单链表struct
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
- 创建无头结点的单链表(尾插法)
LNode *CreatList_Nhead()//无头结点,返回指针类型
{
ElemType x;
LNode *head;
LNode *rear;
LNode *temp;
head = rear = nullptr;
cout << "请输入链表的值:" << endl;
cin >> x;
while (x != 9999)
{
temp = new LNode[sizeof(LNode)];
temp->data = x;
if (head == NULL) head = temp;
else rear->next = temp;
rear = temp;
cin >> x;
}
rear->next = nullptr;
return head;
}
或者这样
LinkList List_TailInsert(LinkList &L)//有无头结点的List创建
{
ElemType x;
int count = 0;
// *L = new LinkList[(sizeof(LNode))];
// L = (LinkList)malloc(sizeof(LNode));//初始化链表
LNode* s;//每次插入结点的指针
LNode* r=L;//表尾指针,最初没有给*r赋值,报错了
cout << "请输入链表的值:" << endl;
cin >> x;
while (x != 9999)
{
s = new LNode[sizeof(LNode)];
s->data = x;
if (count==0) L = s;
else
r->next=s;
r = s;//将r设为表尾指针
cin >> x;
count++;
}
r->next = nullptr;
return L;
}
- 创建有头结点的单链表
LinkList List_TailInsert(LinkList &L)//有无头结点的List创建
{
ElemType x;
int count = 0;
// *L = new LinkList[(sizeof(LNode))];
L = (LinkList)malloc(sizeof(LNode));//初始化链表
LNode* s;//每次插入结点的指针
LNode* r=L;//表尾指针,最初没有给*r赋值,报错了
cout << "请输入链表的值:" << endl;
cin >> x;
while (x != 9999)
{
s = new LNode[sizeof(LNode)];
s->data = x;
r->next=s;
r = s;//将r设为表尾指针
cin >> x;
count++;
}
r->next = nullptr;
return L;
}
4.主函数(输出无头结点的,注释部分while是生成有头结点的)
int main()
{
LinkList L;//用于存储变量地址的指针,也就是说LNode* L等价于LinkList L
L= List_TailInsert(L);
// L = CreatList_Nhead();
cout << "链表输出:" << endl;
/*
while (L->next!= NULL)//指向首结点,之后再next
{
cout << L->next->data << " ";//L是有头结点的,L->next才是头指针
L = L->next;
}
*/
while (L!=nullptr)//指向首结点,之后再next
{
cout << L->data<<" ";//L是有头结点的,L->next才是头指针
L = L->next;
}
return 0;
}
总结
- 感觉最使我困惑的就是定义类的时候
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
其中在main中,初始化L时,LNode* L等价于LinkList L,然后传入的是指针变量L
- 还有就是指针和引用作为函数参数的联系
引用:是另一变量的别名,通过引用名于与通过被引用的变量来访问变量的效果是一样的
所以形参是引用的话,就是对实参的操作
值传递、引用传递: 这里讲得很清楚