#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
typedef int Status;
//链表元素的数据类型
typedef struct
{
char name[20];
float score;
}ElemType;
//线性链表的单链表存储结构
typedef struct
{
ElemType data;
struct LNode *next;
}LNode,LinkList;
int main()
{
LinkList *L,*p,*s;
ElemType e1,e2,e3;
strcpy(e1.name,"张无忌");
e1.score=55.33;
strcpy(e2.name,"赵敏");
e2.score=66.22;
strcpy(e3.name,"周芷若");
e3.score=55.33;
//创建一个带头结点的单循环空链表
L=(LinkList *)malloc(sizeof(LNode));//忽略溢出
L->next=L;
//插入元素e1
p=L;
s=(LinkList *)malloc(sizeof(LNode));
s->data=e1;
s->next=p->next;
p->next=s;
//插入元素e2 头插
p=L;
s=(LinkList *)malloc(sizeof(LNode));
s->data=e2;
s->next=p->next;
p->next=s;
//插入元素e3,插到两者之间
p=L->next;
s=(LinkList *)malloc(sizeof(LNode));
s->data=e3;
s->next=p->next;
p->next=s;
p=L->next;
//循环链表与普通单链表的插入和删除雷同,只是初始化操作和判断链表为空有所差别
while(p!=L)
{
printf("姓名:%s 分数:%5.2f 住址:%x,房间大小:%d\n",p->data.name,p->data.score,p,sizeof(LNode));
p=p->next;
}
printf("大家同在一个屋檐下:%x,连上头结点总共用了%d\n",L,4*sizeof(LinkList));
printf("突然搞明白了,初始化链表的时候,L->next=NULL或者L->next=L逻辑上就有两个节点,一个指向下一个,一个指向自己,只是没有为这个指向的节点分配空间而已");
return 0;
}
运行结果