void InsertSeqList L,DataType x,int i)
{
if (L.length==Maxsize) exit("表已满")
if (i<1 || i>L.length+1) exit("位置错")
for(j=L.length;j>=i;j--) //从后往前一个一个挪
L.data[i-1]=x;
L.length++;
}
void DeleteSeqList(SeqList L,int i)
{
if(i<1||i>L.length)
exit("非法位置")
for(j=i;j<L.length;j++)
L.data[j-1]=L.data[j];
L.length--;
}
void LocateSeqlist(Seqlist L,DataType x)
{
int i=0;
while((i<L.length)&&(L.data[i]!=x))
i++;
if(i<L.length) return i+1
else return 0;
}
注:单链表可以比作火车,有一个火车头(头指针变量),该变量的值是指向单链表的第一个结点的指针。判断单链表是否为空指针的条件如下:head——>next==NULL或head——>next!=NULL
LinkList InitiateLinkList()
{
LinkList head; //头指针
head=malloc(sizeof(Node)); //动态构建一结点,为头结点
headhead->next=NULL;
return head;
}
int LengthLinklist(LinkList head)
{
Node *p=head;
int cnt=0;
while(p->next!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
Node * GetLinklist(LinklList head,int i)
{
Node *p;
p=head->next;;
int c=1;
while ((c<i)&&(p!=NULL))
{p=p->next;c++;}
if(i==c) return p;
else return NULL;
}
int LocateLinklist(LinkList head,DataType x)
{
Node *p=head;
p=p->next;
int i=0;
while((p!=NULL)&&(p->data!=x))
{
i++;
p=p->next;
}
if(p!=NULL) return i+1;
else return 0;
}
1.q指针指向i-1结点,p指针指向待加入结点x
2.p指针指向q的直接后继:p->next=q->next;
3. q指针指向p:q->next=p;
void InsertLinklist(LinkList head,DataType x,int i)
{
Node *p,*q;
if(i==1) q=head;;
else q=GetLinklist(head,i-1);
if(q==NULL)
exit("找不到插入位置")
else
{
p=malloc(sizeof(Node));p->data=x;
p->next=q->next;
q->next=p;
}
}
void DeleteLinklist(LinkList head,int i)
{
Node *p;
if(i==1)q=head;
else q=GetLinklist(head,i-1); //找到待删除结点的直接前驱
if(q!=NULL&& q->next!=NULL)
{
p=q-next;
q->next=p->next;
free(p); //释放已经移出结点p的空间
}
else exit("找不到要删除的结点")
}
LinkList CreatLinklist1(){
Linklist head;
int x,i;
head=InitiateLinklist(); //建立空表
i=1;
scanf("%d",&x)
while(x!=0);
{
InsertLinklist(head,x,i);
i++;
scanf("%d",&x); //读下一元素
}
return head;
}
时间复杂度为O(n2)
LinkList CreateLinklist2()
{
Linklist head;
Node *q,*t;
int x;
head=malloc(sizeof(Node)) //生成头结点
q=head;
scanf("%d",%x);
while(x!=0)
{
t=malloc(sizeof(Node));t->data=x; //生成一个新结点
q->next=t; //新结点t链入
q=t //修改尾指针q,指向新的尾结点
scanf("%d",&x);
}
q->next=NULL;return head; //q指向尾结点,置尾结点结束
}
LinkList CreateLinklist3()
{
Linklist head;
Node *p;
int x;
head=malloc(sizeof(Node)); //生成头结点
head->next=NULL;
scanf("%d",&x);
while(x)
{
p=malloc(sizeof(Node));
p->data=x;
p->next=head->next; //前插,插入到头结点之后第一个结点之前
head->next=p;
scanf("%d",&x);
}
return head;
}
时间复杂度为O(n)
void PurgeLinklist(LinkList head)
{
Node *p,*q,*r
q=head->next; //q指向首结点
while(q!=NULL)
{
p=q; //p指向*q
while(p->next!=NULL)
if(p->next->data==q->data) //若重复
{
r=p->next; //r指向待删除结点
p->next=r->next; //p的直接后继等于r的直接后继,移出待删结点
free(r); //释放
}
else p=p->next; //检查下一个
q=q->next; //更新检查结点
}
}
尾结点的指针域指向第一个结点即构成循环链表
在单链表的每个结点中再设置一个指向其直接前驱结点的指针域prior,即为双向循环链表
p=p->next=p->next->prior
p->next->prior=p->next;
p->next->prior=p->prior;
free(p);
t->prior=p;
t->next=p->next;
p->next->prior=t;
p->next=t;
______;
r=s;
r->next=NULL;
s->next=p;
s->prior=p->prior;
p->prior=s;
_______=s。