创建有头结点/无头结点的单链表(c/c++)

复习数据结构,本来题目是删除具有x值的结点,但是不先创建链表,哪来的删呢?所以花了一上午折腾怎么生成无头结点的链表(有头结点书上有)这里就贴出来我struggle出来的成果

  1. 单链表struct
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;
  1. 创建无头结点的单链表(尾插法)
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;
}

  1. 创建有头结点的单链表
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

  • 还有就是指针和引用作为函数参数的联系
    引用:是另一变量的别名,通过引用名于与通过被引用的变量来访问变量的效果是一样的
    所以形参是引用的话,就是对实参的操作

值传递、引用传递: 这里讲得很清楚

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Python中的类来表示单链表,每个节点包含数据和指向下一个节点的指针。无头结点单链表通常需要在插入和删除节点时特别处理。 下面是一个示例代码,创建一个头结点单链表,并添加几个节点: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def add(self, data): new_node = Node(data) if not self.head: self.head = new_node else: current_node = self.head while current_node.next: current_node = current_node.next current_node.next = new_node linked_list = LinkedList() linked_list.add(1) linked_list.add(2) linked_list.add(3) ``` 在上面的示例中,我们定义了两个类,一个是节点类Node,一个是单链表类LinkedList。每个节点包含一个数据和一个指向下一个节点的指针。单链表类包含一个头节点,初始值为None,表示一个空链表。我们提供了一个add()方法来添加新节点。 在add()方法中,如果链表为空,则将新节点设置为头节点。否则,我们遍历链表找到最后一个节点,并将新节点添加到最后一个节点的next属性中。 注意,由于这是一个无头结点单链表,我们需要特别处理在链表开头插入节点的情况。在这种情况下,我们需要将新节点设置为头节点,并将它的next属性指向原来的头节点。在删除节点时,我们需要特别处理删除头节点的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值