1.单链表结构体的理解
常见的两种形式定义结点:
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkList;
①typedef struct Node是对结点的定义
②这里ElemType是struct的复合类型完全可以写作int data
③在第一个代码块中Node代表结点的类型,而LinkList代表指向Node结点类型的指针
④第二种形式定义时:(以下面为例)
void create(CLinkList *a,CLinkList *&b)
这里对CLinkList *a的形参定义是:只对a进行遍历等操作不可以修改a的值
CLinkList *&b的形参定义是:可以修改b的值
⑤第一种形式定义时:(以下面为例)
void create(CLinkList a,CLinkList &b)
对a的形参定义是:只对a进行遍历等操作,不可更改
对b的定义是可以修改b
当函数参数为LinkList L时,意味着只改变或操作List的内容,而不需要改变L这个指针
当参数为LinkList &L时,意味着需要改变或操作L这个指针本身
当参数为LinkList *L时,意味着需要改变或操作L这个指针指向的LinkList类型的指针
2.初始化操作:
//创建头结点和尾指针
//表位空时,尾指针指向头结点,头结点指针域指向自己
void primary(CLinkList rear)
{
//创建一个头结点,让头结点指向自己
Node *L=(CLinkList)malloc(sizeof(CNode));
L->next=L;
//让尾指针指向头结点
rear=L;
while(rear!=L)
printf("初始化失败!");
if(rear==L)
printf("初始化成功!");
}
这里插一句malloc函数:
Node *L=(CLinkList)malloc(sizeof(Node));的意思是:
获取Node的字段长度,然后强转为Linklist类型。L变量就代表地址长度和Node一样所占内存空间同样大小的Linklist
3.录入循环单链表(两种方法)
头插法:

//头插法建立循环单链表
LinkList CreateFromHead(LinkList &rear)
{
Node *p;
ElemType x;
printf("请输入单链表的数据直到0为止:\n");
scanf("%d",&x);
while (x!=0)
{
p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=L->next;
L->next=p;
scanf("%d",&x);
}
printf("录入成功!");
return L;
}
尾插法:

//尾插法建立循环单链表
LinkList Create_LinkListR(CLinkList &rear)
{
Node *p;
ElemType x;
printf("请输入单链表的数据直到0为止:\n");
scanf("%d",&x);
while (x!=0)
{
p=(CNode*)malloc(sizeof(CNode));
p->data=x;
rear->next=p;
rear=p;
scanf("%d",&x);
}
rear->next=L;
printf("录入成功!");
return rear;
}
4.输出循环单链表的长度
//输出循环单链表的长度
int ListLength(CLinkList rear)
{
CNode *p;
int i=0;
p=L->next;
while(p!=L)
{
i++;
p=p->next;
}
printf("单链表的长度为%d",i);
return i;
}
2345

被折叠的 条评论
为什么被折叠?



