"现在是中午了,呼,一鼓作气,把剩下的也学完吧"。
我拉开桌旁的椅子坐了下来,翻开了书。"之后是:循环链表,和单链表有什么区别呢,沐露?","很简单,以单向循环链表为例,将单链表中最后一个单元(结点)的指针由空指针指向头单元(结点),从其中的任意位置出发,都可以访问到全部的单元(结点),图示的话,如下:
所以,两种只有在循环判断上的差异,即判断p或者p->next是否为空,而是是否等于头指针。"
"原来如此,那么...(算法之后会加上-2020.1.2)
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}slink;
//create
slink* createlist(int n){
slink *head,*p,*s;
int j;
if(n<1)return NULL;
p=head=(slink*)malloc(sizeof(slink));
for(j=0;j<n;j++){
s=(slink*)malloc(sizeof(slink));
cin>>s->data;
p->next=s;
p=s;
}
p->next=head;//最后一个结点指向头指针
return head;
}
//count
int getlength(slink *head){
slink *p;
int count=0;
while(p!=head){
count++;
p=p->next;
}
return count;
}
//get
int getelem(slink *head,int i,ElemType *e){
int j=1;
slink *p;
if(i<1)return 0;
p=head->next;
while (p!=head&&j<i)
{
j++;
p=p->next;
}
if(p==head)return 0;
return p->data;
}
//where
slink *locate(slink *head,ElemType x){
int i=1;
slink *p=head->next;
while (p->next!=head&&p->data!=x)
{
p=p->next;
i++;
}
if(p==head)
return NULL;
else
return p;
}
//delete
int deleteslink(slink*head,int i){
slink *p=head->next,*q;
int j=0;
if(i<1)return 0;
while (p->next!=head&&j<i-1)
{
p=p->next;
j++;
}
if(p->next==head)return 0;
q=p->next;
p->next=q->next;
free(q);
return 1;
}
//insert
int insertslink(slink *head,int i,ElemType x){
slink *p=head,*q;
int j=0;
if(i<1)return 0;
while (p->next!=head&&j<i-1)
{
p=p->next;
j++;
}
if((p->next!=head)||p->next==head&&j==i-1){
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
else
{
return 0;
}
}
//out
void outslink(slink *head){
slink *p;
p=head->next;
while(p!=head){
cout<<p->data<<endl;
p=p->next;
}
}
"下来是双循环链表了","双循环链表就是将双链表最后一个单元(结点)的后继指针域的值由空改为指向头单元(结点),头单元(结点)中的前驱指针域的值由空改为指向尾单元(结点),这样的双向链表称为双循环链表,用图示的话:
下来是空的情况:
"双循环链表实际上是两个单向循环链表的合成,定义如下:
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *next;
struct node *prior;
}dlink;
对它的操作基本和双链表一致,首先是创建:
dlink *initlist(int n){
dlink *head,*p,*s;
int i;
p=head=(dlink*)malloc(sizeof(dlink));
for(i=0;i<n;i++){
s=(dlink*)malloc(sizeof(dlink));
cin>>s->data;
s->prior=p;
p->next=s;
p=s;
}
p->next=head;
head->prior=p;
return head;
}
下面来一个简单点的,计算表长:
int getdlink(dlink *head){
int i=0;
dlink *p=(dlink*)malloc(sizeof(dlink));
p=head->next;
while(p!=head){
i++;
p=p->next;
}
free(p);
return i;
}
所以还是很简单吧?“,"我还是整理下记录下来吧"。
(记笔记)(吃晚饭),"看来短时间回不去了呢",我自言自语到,"今天就记录到这里吧”。
那么今天的日期:2020.1.3
//字数会有增加-2020.1.3
//算法已补上-2020.1.4