源代码
typedef struct SingleNode
{ ElemType data;
struct SingleNode *next; }
SingleLinkedList,*LinkList;
void ListInitialize (SingleLinkedList **head)
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
{
if((*head = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
exit(1);
(*head)->next = NULL; /*置链尾标记NULL */
}
int ListLength (SingleLinkedList *head)
{
SingleLinkedList *p = head; /*p指向头结点*/
int size = 0; /*size初始为0*/
while(p->next != NULL) /*循环计数*/
{ p = p->next;
size ++;
}
return size;
}
int ListInsert (SingleLinkedList *head, int i, ElemType x)
/*在带头结点的单链表head的数据元素ai(0 ≤ i ≤ size)结点前*/
/*插入一个存放数据元素x的结点*/
{
SingleLinkedList *p, *q;
int j;
p = head; /*p指向头结点*/
j = -1; /*j初始为-1*/
while(p->next != NULL && j < i - 1) /*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
if(j != i - 1)
{
printf("插入位置参数错!");
return 0;
}
/*生成新结点由指针q指示*/
if((q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
exit(1);
q->data = x;
q->next = p->next; /*给指针q->next赋值*/
p->next = q; /*给指针p->next重新赋值*/
return 1;
}
int ListDelete (SingleLinkedList *head, int i, ElemType *x)
/*删除带头结点的单链表head的数据元素ai(0 ≤ i ≤ size - 1)结点*/
/*删除结点的数据元素域值由x带回。删除成功时返回1;失败返回0*/
{
SingleLinkedList *p, *s;
int j;
p = head; /*p指向头结点*/
j = -1; /*j初始为-1*/
while(p->next != NULL && p->next->next!= NULL && j < i - 1)
/*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
if(j != i - 1)
{
printf(“删除位置参数错!");
return 0;
}
s = p->next; /*指针s指向数据元素ai结点*/
*x = s->data; /*把指针s所指结点的数据元素域值赋予x*/
p->next = s->next; /*把数据元素ai结点从单链表中删除掉*/
free(s); /*释放指针s所指结点的内存空间*/
return 1;
}
void ListDestroy (SingleLinkedList **head)
{
SingleLinkedList *p, *p1;
p = *head;
while(p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}