链表
eq:
struct student
{
char name[20]
int age;
char sex;
struct student*next
};
性质:头结点无前驱。尾结点无后驱。
可以没有头结点与尾结点
链表插入
头插法与尾插法
头插法是在头结点与第一个结点中间插入。
尾插法是在尾结点后面插入。
步骤:
1.移动指针
2.分配空间
3.操作指针
重点
1.
int LinkInsert(Node **l, ElemType e) //n 插入的位置
{
//尾插法
if (*l == NULL) //空链表
{
*l = (Node *)malloc(sizeof(Node) * 1);
if (NULL == *l)
{
return FAILURE;
}
return SUCCESS;
} //非空链表
else
{
Node *p = *l;
while (p->next != NULL) //指针移动到最后一个
{
p = p->next;
}
Node *n = (Node *)malloc(sizeof(Node) * 1);
if (NULL == n)
{
return FAILURE;
}
p->next = n;
n->data = e;
n->next = NULL;
return SUCCESS;
}
}
2.
int LinkInsert(Node *l, int n, ElemType e) //n 插入的位置
{
Node *p = l;
int k = 1; //k 移动的次数
if (NULL == l)
{
return FAILURE;
}
while (k < n && p != NULL)
{
p = p->next;
k++;
}
if (k > n || p == NULL)
{
return FAILURE;
}
Node *q = (Node *)malloc(sizeof(Node) * 1);
if (NULL == q)
{
return FAILURE;
}
q->data = e; //数据域
q->next = p->next;
p->next = q;
return SUCCESS;
}
重点
倒序链表
int LinkReverse(Node *l)
{
if (NULL == l)
{
return FAILURE;
}
Node *p = l->next;
l->next = NULL;
while (p != NULL)
{
Node *q = p;
p = p->next;
q->next = l->next;
l->next = q;
}
return SUCCESS;
}
一次一次的循环将原来的链表倒序放置