一、单链表抽象数据类型定义:
#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;
二、有头结点的单链表初始化:
/*单链表初始化,初始化成功返回1,否则返回0*/
int Init_Linklist(Linklist *L)
{
*L=(Linklist)malloc(sizeof(LNode));//创建头结点
if(!(*L)) return ERROR; //创建失败返回0
(*L)->next=NULL; //将头结点指向为空
return OK;
}
三、单链表头插法:
/*单链表头插法*/
void Creat_LinklistHead(Linklist *L)
{
int i;
LNode *q; //定义新生节点
srand(time(0)); //产生随机数种子通常和rand()函数配套使用
for(i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode)); //创建新节点
q->data=rand()%100+1; //随机产生一个100以内的数
q->next=(*L)->next; // 将头节点指向的地址赋给新生成的节点的指针
(*L)->next=q; // 将头结点指针指向新生成的节点
}
}
四、单链表尾插法:
/*单链表尾插法*/
void Creat_LinklistTail(Linklist *L)
{
int i;
LNode *p,*q;
p = *L;
srand(time(0)); //产生随机数种子通常和rand()函数配套使用
for(i=0;i<LEN;i++)
{
q=(Linklist)malloc(sizeof(LNode)); //创建新节点
q->data=rand()%100+1; //随机产生一个100以内的数
p->next=q; //将指针指向尾节点
p=q;
}
p->next=NULL; //将尾节点指向为空
}
五、带头结点的链表表长
/*带头结点的链表表长*/
int Length_Linklist1(Linklist *L)
{
int i=0;
LNode *p;
p = *L;
while(p->next)
{
p=p->next;
i++;
}
return i;
}
六、不带头结点的链表节点数
/*不带头结点的链表表长*/
/*int Length_Linklist2(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 *p,*q;
p=(*L)->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
六、主函数:
int main()
{
int length,value;
Linklist L;
value=Init_Linklist(&L); //单链表初始化
if(value) printf("初始化链表成功!\n");
else return ERROR;
Creat_LinklistTail(&L); //尾插法
//Creat_LinklistHead(&L); //头插法
Display(&L);
length=Length_Linklist1(&L);
printf("该单链表表长为:%d",length);
return 0;
}
七、头插法运行截图显示:
八、尾插法运行截图显示: