带头结点的线性链表代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带头结点的线性链表代码相关的知识,希望对你有一定的参考价值。


//单链表的结点定义
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;

//初始化ListInitiate(SLNode **head)
void ListInitiate(SLNode **head)
{
*head=(SLNode *)malloc(sizeof(SLNode));
(*head)->next=NULL;
}

//求当前元素个数ListLength(SLNode *head)
int ListLength(SLNode *head)
{
SLNode *p=head;
int size =0;
//循环计数
while(p->next!=NULL)
{
p=p->next;
size++;

}
return size;
}


//插入Insert(SLNode *head,int i,DataType x)
int ListInsert(SLNode *head,int i,DataType x)
{
SLNode *p,*q;
int j;

p=head;
j=-1;
while(p->next!=NULL&&j<i-1)
//最终让指针p指向第i-1个结点
{
p=p->next;
j++;
}

if(j!=i-1)
{
printf("插入元素位置参数错!");
return 0;
}

//生成新结点,并赋值
q=(SLNode *)malloc(sizeof(SLNode));
q->data=x;

//插入步骤
q->next=p->next;
p->next=q;
return 1;
}

 


//删除ListDelete(SLNode *head,int i,DataType *x)
int ListDelete(SLNode *head,int i,DataType *x)
{
SLNode *p,*s;
int j;
p=head;
j=-1;
while(p->next!=NULL&&p->next->next!=NULL&&j<i-1)
//循环结束时指针p指向第i-1个结点
{
p=p->next;
j++;
}

if(j!=i-1)
{
printf("删除元素位置参数错!");
return 0;
}
s=p->next;
*x=s->data;
p->next=p->next->next;//删除
free(s); //释放指针s所指向结点的内存空间
return 1;
}

//取数据元素ListGet(SLNode *head,int i,DataType *x)
int ListGet(SLNode *head,int i,DataType *x)
{
SLNode *p;
int j;
p=head;
j=-1;
while(p->next!=NULL && j<i)
{
p=p->next;
j++;
}
if(j!=i)
{
printf("取元素位置出错!");
return 0;
}
*x=p->data;
return 1;
}

//撤销单链表Destroy(SLNode **head)
void Destroy(SLNode **head)
{
SLNode *p,*p1;
p=*head;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
*head=NULL;
}

 

以上是关于带头结点的线性链表代码的主要内容,如果未能解决你的问题,请参考以下文章

带头结点的线性链表代码

数据结构线性表链式存储实现

带头结点与不带头节点的几点区别

线性表文档之循环双链表

试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。下面各个步骤的解释要详细

[数据结构-严蔚敏版]P37定义一个带头结点的线性链表