(一)关于对节点的定义,其实这是一个结构体(不会的可以在百度查查结构体定义),包含数据域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;
}
可以直接运行的,谢谢支持!