首先,在认识一般性操作代码前搞懂以下几个定义及解释:
1.头指针表明了链表的起点,可以唯一确定一个单链表。
2.头指针指向链表的第一个结点,其指针域存储的是第一个结点在内存中的位置(地址)。
3.头结点是单链表的第一个结点,数据内容无效,其指针是头指针。
若单链表有头结点,则头指针指向头结点;若单链表不含头结点,则头指针指向第一个结点。
4.一个单链表可以没有头结点,但不能没有头指针。
如图:
不带头结点的单链表
带头结点的单链表
另外一种链表的技巧是使用尾指针。
尾指针是相对于头指针而言的,形式与头指针相同,内容指向链表的最后一个节点。
struct link
{
int data;
struct link *next;
}
1.建立链表并输入数据
struct link *head = NULL; /* 链表头指针 */
while (1)
{
scanf("%d", &data);
if (data == -1)
break;
head = AppendNode(head, data); //向head为头指针的链表末尾添加节点
}
(1).
struct link *AppendNode(struct link *head, int data)
{
struct link *p = NULL, *pr = head;
p = (struct link*)malloc(sizeof(struct link));//新建节点
if (head == NULL)
{
head = p;//若为空表,那么新节点就是头节点
}
else
{
while (pr->next != NULL)
{
pr = pr->next;
}//指到最后一个节点的指针域
pr->next = p;//末指针域指向新建节点
}
p->data = data;//赋值
p->next = NULL;
return head;
}
//这种是顺序建立,即新建节点数据在上一个新建节点的后面
//无头节点,推荐使用这个
(2).
struct link *pr = NULL;//全局变量
struct link *AppendNode(struct link *head, int data)
{
struct link *p = NULL;
p = (struct link *)malloc(sizeof(struct link));//p指向新建节点
if (head == NULL)
{
head = p;
head->next = NULL;
pr = head; //此时Pr也指向了p,即新建的节点
}
p->data = data;//赋值
p->next = NULL;
pr->next = p;
pr = p; //倒着看,从第二个开始,
return head;
}
//这也是顺序链接
//不推荐使用,较难理解,且运行内存不够(全局变量)
2.显示链表
void DisplyNode(struct link *head)
{
struct link *p = head;
for (p = head; p != NULL; p = p->next)
{
printf("%d", p->data);
if (p->next != NULL)
printf("->");
}
}
3.释放内存
void DeleteMemory(struct link *head)
{
struct link *p, *pnext;
p = head;
while (p != NULL)
{
pnext = p->next;
free(p);
p = pnext;
}
}
4删除节点
struct ListNode *deletem(struct ListNode *L, int m)
{
struct ListNode *p1 = L, *p2 = NULL;
while (p1)
{
if (p1->data == m)
{
if (p1 == L)
{
L = p1->next;
free(p1);
p1 = L;
}
else
{
p2->next = p1->next;
free(p1);
p1 = p2->next;
}
}
else
{
p2 = p1;
p1 = p1->next;
}
}
if (p2 != NULL)
p2->next = NULL;
return L;
}
//循环删除所有要删除的数据
//推荐记忆
5.插入节点
//在升序的链表中插入节点
struct link *InsertNode(struct link *head, int nodeData)
{
struct link *p = head, *pr = head,*t=NULL;
p = (struct link*)malloc(sizeof(struct link));//p是插入的
p->data = nodeData;
p->next = NULL;
if (head == NULL)
head = p;
else
{
while (pr->data < nodeData&&pr->next != NULL)
{
t = pr;
pr = pr->next;//记录最后一个比nodeData小的节点
}
if (pr->data >= nodeData)
{
if (pr == head)
{
p->next = head;
head = p;
}
else
{
pr = t;
p->next = pr->next;
pr->next = p;
}
}
else
{
pr->next = p;
}
}
return head;
}