【摘要】本文讨论的均为带头结点的线性链表的基本操作,包括创建、删除、插入、打印等等,欢迎大家批评指正错误。
(1)单链表存储结构
typedef struct LNode
{
int data;
struct LNode *next;
}LinkList;
(2)创建链表
/* 功能:构建一个空的带头节点的单链表*/
Status InitList (struct LNode **L)
{
(*L) = (struct LNode *)malloc(sizeof(struct LNode)); //产生头节点
if(!*L){
return ERROR;
}
(*L)->next = NULL;//作为结束标志位
return OK;
}
(3)删除链表
/*带头结点链表删除*/
Status ClearList(struct LNode *L)//
{
LinkList *p,*q;
p = L->next; //第一个结点
while(p)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL; //头结点指针域清空
return OK;
}
(4)插入数据
/* 在带头节点的单链表L中的第i个位置之前插入元素e*/
Status ListInsert(struct LNode *L,int i,int e)
{
int j =0;
struct LNode *p=L,*s=NULL;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1)//没有找到
return ERROR;
s = (struct LNode *)malloc(sizeof(struct LNode));
if(!s)
printf("malloc error~\n");
s->data = e;
s->next = p->next;//插入节点
p->next = s;
return OK;
}
(4)删除单个节点
/*在带头节点的单链表中删除第i个元素,并有e返回其值*/
Status ListDelete(LinkList *L,int i,int *e)
{
LinkList *p=L,*q;
int j=0;
while(p->next && j< i-1)
{
p = p->next;
j++;
}
if(!p->next || j>i-1)
return ERROR;
q = p->next; //保存下来
p->next = q->next;
*e = q->data;
free(q);
return OK;
}
(5)打印数据
/* 依次对L的每个元素打印输出数据*/
Status ListTraverse(struct LNode *L,void (*vi)(int))
{
LinkList *p = L->next; //第一个结点
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
printf("\n");
return OK;
}
时间: 2024-11-03 21:07:59