主要学习了链表的三个函数:插入节点,删除节点,排序。
(1)插入节点函数
1、传递的参数
参数主要有三个,链表的头结点Head,要插入的位置pos,要插入的元素的值val。
2、此函数的执行循序
首先,定义一个结构体指针变量p,方便后面的操作。然后一段代码
while(p->pnext!= NULL && i < pos -1)
{
p = p->pnext;
++ i;
}
的作用是将p指向要插入节点的前一个节点。假设要在第4个节点前面插入一个节点,则此代码会使p指向第三个节点。
然后利用if(p->pnext == NULL || i > pos -1)
return false;
来判断,如果不满足上面的要求就返回false。然后申请两个节点,一个是指向当前p的下一个节点,而另一个就是需要插入的节点。
最后将它们连接起来p->pnext = pNew;pNew->pnext = q;
(2)删除节点函数
删除节点函数的前一部分跟插入节点函数基本心相同。然后将删除节点的后一节点的地址付给删除节点的前一节点的pnext,即p->pnext = p->pnext->pnext;
(3)排序节点元素
利用的方法是:将一个元素与它后面的所有元素进行比较找出最大值。
(4)链表完整的代码:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node
{
int data;//数据域
struct node *pnext;//指针域
}Node, *pNode;
/**创建链表**/
pNode Create_node(void)
{
pNode Head, p1, p2;
int val,num,i;
Head = (pNode)malloc(sizeof(Node));//p=(struct node *)malloc(sizeof(struct node))
Head->pnext = NULL;
if(Head == NULL)
{
printf("内存分配失败,程序终止");
exit(-1);
}
//
p2 = Head;
printf("请输入创建节点的个数:");
scanf("%d",&num);
for(i = 0; i < num; i ++)
{
printf("请输入节点的值:");
scanf("%d",&val);
p1 = (pNode) malloc(sizeof(Node));
p1->pnext = NULL;
p1->data = val;
p2->pnext = p1;
p2 = p1;
}
return Head;
}
/**遍历链表**/
void traverse_list(pNode Head)
{
pNode p1;
if(Head->pnext == NULL);
// return;
else
{
p1 = Head->pnext;//注意此处不是p1 = Head,而是p1 = Head->pnext
printf("遍历后输出的值为:");
while(1)
{
if(p1->pnext == NULL)
{
printf("%d ",p1->data);
break;
}
printf("%d ",p1->data);
p1 = p1->pnext;
}
printf("\n");
}
}
/**判断链表是否为空**/
bool is_empty(pNode Head)
{
if(Head->pnext == NULL)
{
//printf("该链表为空");
return true;
}
//printf("该链表不为空");
return false;
}
/**求链表的长度**/
int length_list(pNode Head)
{
int i = 0;
pNode p1;
if(is_empty(Head))
printf("该链表为空\n");
else
{
p1 = Head->pnext;
while(1)
{
if(p1->pnext == NULL)
{
i ++;
break;
}
i ++;
p1 = p1->pnext;
}
}
//printf("链表的长度为:%d\n",i);
return i;
}
/**插入元素**/
bool insert_list(pNode Head, int pos, int val)
{
int i = 0;
pNode p;
p = Head;
while(p->pnext!= NULL && i < pos -1)
{
p = p->pnext;
++ i;
}//将p指向要插入节点位置的前一个节点
if(p->pnext == NULL || i > pos -1)//i > pos -1的作用是当i取负值时的一种情况
return false;
pNode pNew = (pNode)malloc(sizeof(Node));
if(pNew == NULL)
{
printf("动态内存分配失败");
exit(-1);
}
pNew->data = val;
pNew->pnext = NULL;
pNode q = p->pnext;
p->pnext = pNew;
pNew->pnext = q;
return true;
}
/**删除元素**/
bool delete_list(pNode Head, int pos, int * val)
{
int i= 0;
pNode p = Head;
while(p->pnext != NULL && i < pos -1)
{
p = p->pnext;
++ i;
}
if(p->pnext == NULL || i > pos -1)
return false;
pNode q = p->pnext;
*val = q->data;
p->pnext = p->pnext->pnext;
free(q);
q = NULL;
return true;
}
/**排序元素**/
void sort_list(pNode Head)
{
int i, j, t;
pNode p, q;
int len = length_list(Head);
for(i = 0, p = Head->pnext; i < len - 1; i ++, p = p->pnext)
for(j = i + 1,q = p->pnext; j < len -1; j ++,q = q->pnext)
{
if(p->data > q->data)//如果p->data > q->data 就将两个数进行交换
{
t = p->data;
p->data = q->data;
q->data = t;
}
/*****************
if(a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
*****************/
}
return ;
}
int main(void)
{
pNode pHead;
int length,val;
pHead = Create_node();
traverse_list(pHead);
length = length_list(pHead);
printf("链表的长度为%d:\n",length);
sort_list(pHead);//排序
traverse_list(pHead);
insert_list(pHead, 4, 33);
traverse_list(pHead);
delete_list(pHead, 4, &val);
traverse_list(pHead);
}