一、单链表抽象数据类型定义
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define LEN 10
typedef int Elemtype; //数据类型重定义
typedef struct LNode{
Elemtype data; //数据域
struct LNode *next; //指针域
}LNode,*Linklist;
二、不带头结点的单链表头插法
/*不带头结点的单链表头插法*/
void Create_LinklistHead(Linklist *L)
{
int i;
LNode *q; //定义新节点
*L=NULL; //建立空链表
srand(time(0)); //生成随机数种子通常和rand()配套使用
for(i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode));//生成新节点
q->data=rand()%100+1; //生成1-100以内的随机数
q->next=*L; //将*L所指向的地址赋给新生成的节点指针
*L=q; //头指针指向新生成节点
}
}
三、不带头结点的单链表尾插法
/*不带头结点的单链表尾插法*/
void Creat_LinklistTail(Linklist *L)
{
int i;
LNode *q,*p; //定义新节点指针和尾指针
*L=NULL; //定义一个空表
p = *L;
srand(time(0)); //生成随机数种子通常和rand()配套使用
for(i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode)); //生成新节点
q->data=rand()%100+1; //生成1-100以内的随机数
if((*L)==NULL) (*L)=q; //插入节点是最前面的节点
else p->next=q; //插入节点是第一个以外的节点
p=q; //p恒指向插入后的链表尾节点
}
if(p!=NULL) //如果链表非空,则尾节点指向为空
p->next=NULL;
}
四、不带头结点的链表节点数
/*不带头结点的链表节点数*/
int Length_Linklist(Linklist *L)
{
int i=1; //计数器统计节点数
LNode *p;
p = *L;
if(p==NULL) return ERROR; //空表,返回值为0
while(p->next)
{
p=p->next;
i++;
}
return i;
}
五、不带头结点的链表输出函数
/*不带头结点的链表输出函数*/
void Display(Linklist *L)
{
LNode *q = *L;
while(q)
{
printf("%d ",q->data);
q=q->next;
}
printf("\n");
}
六、主函数
int main()
{
int length;
Linklist L;
//Create_LinklistHead(&L); //不带头结点头插法
Creat_LinklistTail(&L); //不带头结点尾插法
Display(&L);
length=Length_Linklist(&L);
printf("%d",length);
return 0;
}
七、运行效果截图
头插法:
尾插法