数据结构篇:初学者关于链表的结构的理解的指导

(一)关于对节点的定义,其实这是一个结构体(不会的可以在百度查查结构体定义),包含数据域data与指针域pNext,如下:

typedef struct node{
    int data;
    struct node* pNext;
}NODE,*pNode;

好多初学者对于NODE与*pNext不理解,其实就是给结构体再命名而已,NODE等价于struct node,,*pNode等价于struct node(pNode等价于struct node*),这个涉及到指针的知识,大家好好看完指针再来学链表会轻松好多的,而学好链表数据结构也会轻松好多(因为涉及到图,二叉树什么的)。

(二)然后是关于链表的初始化,一个头结点与一个尾节点(尾节点其实初学可以不用一定要定义,只是当涉及到链表合并与遍历会更方便操作),定义好后,讲两点:

(1)给节点分配一个动态地址空间,(pNode)malloc(sizeof(NODE)),malloc()函数(记得加头文件#include<malloc.h>),分配地址的大小为一个节点大小,sizeof()函数是获取变量或者数据类型大小(单位:字节),例如sizeof(int)等于4

(2)要对头结点  pHead->pNext=NULL,一定记得,因为这个时候链表只有头指针,它的指针指向为空(一定要记得)

    pNode pHead=(pNode)malloc(sizeof(NODE));//头结点
    pNode pTail;//尾节点
    pHead->pNext=NULL;
    pTail=pHead;

完整代码:(插入(链表尾部插入),删除)

(输入几个数字以0结束,然后显示输入的链表,然后输入delete,就会删除链表,会有提示的)

#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct node{
    int data;
    struct node* pNext;
}NODE,*pNode;
void Insert(pNode pHead,pNode pNew) ;
void out(pNode pHead);
int main()
{
    int i=2,dat=1,count=0;
    char str[10];
    //初始化
    pNode pHead=(pNode)malloc(sizeof(NODE));
    pNode pTail;
    pHead->pNext=NULL;
    pTail=pHead;
    pNode p=NULL;
    while(scanf("%d",&dat)&&dat!=0){
        count++;
        pNode pNew=(pNode)malloc(sizeof(NODE));
        Insert(pHead,pNew);
        pNew->data=dat;
    }
    printf("链表插入成功\n");
        p=pHead->pNext;
    for(i=0;i<count;i++)
    {
        dat=p->data;
        printf("%d ",dat);    
        p=p->pNext;
        
    }
    scanf("%s",str);
    if(!strcmp("delete",str)){
         out(pHead);
         printf("链表删除成功\n");
         count--;
    }
    p=pHead->pNext;
    for(i=0;i<count;i++)
    {
        dat=p->data;
        printf("%d ",dat);    
        p=p->pNext;
    }
    return 0;
 }
 void Insert(pNode pHead,pNode pNew)//链表的插入
 {
     pNode p;
     p=pHead;
     while(p->pNext!=NULL){
         p=p->pNext;
     }
     p->pNext=pNew;
     p=p->pNext;
     p->pNext=NULL;
 }
 void out(pNode pHead)//删除函数
 {
     pNode p;
     p=pHead;
     while(p->pNext->pNext!=NULL){
         p=p->pNext;
     }
     p->pNext=NULL;
 }

可以直接运行的,谢谢支持!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值