关于链表的简单创建和遍历

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

//    定义链表中的节点
typedef struct node
{
    int member;                //    节点中的成员
    struct node *pNext;        //    指向下一个节点的指针
}Node,*pNode;

//    函数声明
pNode CreateList();                //    创建链表函数
void TraverseList(pNode );        //    遍历链表函数

int main()
{
    pNode pHead = NULL;            //    定义初始化头节点,等价于 struct Node *pHead == NULL
    pHead = CreateList();        //    创建一个非循环单链表,并将该链表的头结点的地址付给pHead
    TraverseList(pHead);        //    调用遍历链表函数
    return 0;
}

//    创建链表函数
pNode CreateList()
{
    int i;                                            //    用于下面循环
    int len;                                        //    用来存放有效节点的字数
    int val;                                        //    用于临时存放用户输入的数据
    pNode pHead = (pNode)malloc(sizeof(Node));        //  分配一个不存放有效数据的头结点
    pNode pTail = pHead;                            //    链表的最后一个节点
    pTail->pNext = NULL;                            //    最后一个节点的指针置为空
    printf("请输入节点个数:");
    scanf("%d",&len);
    for(i = 0; i < len; i++)
    {
        printf("第 %d 个节点的数值:",i+1);
        scanf("%d",&val);
        pNode pNew = (pNode)malloc(sizeof(Node));    //    为节点分配空间
        pNew->member = val;                            //将用户输入的数据赋给节点的成员
        pTail->pNext = pNew;                        //将最后一个节点的指针指向下一个新的节点
        pNew->pNext = NULL;                            //将新节点中的指针置为空
        pTail = pNew;                                //将新节点赋给最后的一个节点
    }
    return pHead;                                    //返回头节点

}

//    遍历链表函数
void TraverseList(pNode pHead)
{
    pNode p = pHead->pNext;                            //将头节点的指针给予临时节点p
    while(NULL != p)                                //节点p不为空,循环

    {
        printf("%d ",p->member);                    
        p = p->pNext;                                
    }
    printf("\n");
    return ;

} 


自己照着视频敲了一遍,结果卡在一个点上

#include<stdio.h>   //创建非循环链表 
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;//相当于直接给了个*号  struct Node *


int main(void)
{
		PNODE pHead	=NULL;//相当于 struct Node *pHead =Null;先定义清空指针 
	pHead = create_list();
	traverse_list(pHead);
	return 0; 
}

PNODE  create_list(void);
{
	int len,i,val;
	PNODE pHead=(PNODE)malloc(sizeof(Node));//分配pHead 
	 pintf("请输入你要生成几个节点");
	 scanf("%d",&len);
	 PNODE pTail=pHead;
	 pTail->pNext=NULL;
	 
	 for(i=0;i<len;i++)
	 {
	 	printf("请输入第%d个数",i+1);
	 	scanf("%d",&val);
		 PNODE pNew =(PNODE)malloc(sizeof(Node));//分配pNew 
		  pNew->data= val;
		  pTail->pNext=pNew;
		  pNew->pNext=NULL;
		  pTail=pNew; 
	 }
	return pHead; 
}

void traverse_list(PNODE pHead)
{
	  PNODE p = pHead->pNext;                            //将头节点的指针给予临时节点p
    while(NULL != p)                                //节点p不为空,循环

    {
        printf("%d ",p->data);                    
        p = p->pNext;                                
    }
    printf("\n");
	   return;
 } 

在这里插入图片描述
老是说定义的函数类型冲突,哪有冲突啊,不是返回地址型嘛,都是用PNODE的啊,咋就错了呢,比较了一下上面的代码感觉都一样就是不知道哪里出了bug,改天再看看。

创造链表:先分配内存,给数据域赋值,将尾结点指向临时节点,再将临时节点指向空,最后将临时节点赋给尾结点。
就像一条蛇一样,先创造一个东西,然后将它吞并,再创造下一个东西,再吞并

猜你喜欢

转载自blog.csdn.net/weixin_43560272/article/details/89164489
今日推荐