#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node * pNext;//指针域
}NODE, *PNODE;//NODE等价于struct Node PNODE等价于struct Node *
//函数声明
PNODE create_list(void); //创建链表
void traverse_list(PNODE pHead); //遍历链表
bool is_empty(PNODE pHead); //判断链表是否为空
int length_list(PNODE); //求链表长度
bool insert_list(PNODE pHead, int pos, int val); //在pHead所指向链表的第pos个节点的前面插入一个新的结点,该节点的值是val, 并且pos的值是从1开始
bool delete_list(PNODE pHead, int pos, int * pVal); //删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中, 并且pos的值是从1开始
void sort_list(PNODE); //对链表进行排序
int main(void)
{
PNODE pHead = NULL;
int val;//删除的那个数
pHead = create_list();
traverse_list(pHead);
printf("length %d\n",length_list(pHead));
insert_list(pHead,3, 10);
traverse_list(pHead);
printf("length %d\n",length_list(pHead));
delete_list(pHead,0,&val);
traverse_list(pHead);
printf("length %d\n",length_list(pHead));
return 0;
}
PNODE create_list(void)
{
int len; //用来存放有效节点的个数
int i; //for循环的i
int val; //用来临时存放用户输入的结点的值
PNODE pHead = (PNODE)malloc(sizeof(NODE));//头指针指向头节点,data为NULL
if(NULL == pHead)
{
printf("分配失败,程序终止");
exit (-1);
}
PNODE pTail=pHead;//用来追加链表
pTail->pNext=NULL;
printf("请输入生成链表的个数:");
scanf("%d",&len);
for ( i = 0; i < len; i++)
{
printf("请输入第%d个节点的值: ", i+1);
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));//新节点
pNew->data = val;//data域赋值
pNew->pNext = NULL;//最后一个节点指针域为空
pTail->pNext = pNew;//两个独立的节点连接起来
pTail = pNew;//第一次循环本来pTail指向头指针,现在指向下一个节点,再为下一次循环做准备
}
return pHead;
}
void traverse_list(PNODE pHead) //遍历链表
{
PNODE p = pHead->pNext; //不能用pHead->pNext直接操作,会改动它的值
while (NULL != p)//第一次循环时P代表第一个节点的地址
{
printf("%d ",p->data);//第一次循环时p->data代表第一个节点数据域的值
p = p->pNext;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead) //判断链表是否为空
{
if (NULL == pHead->pNext)
{
return true;
}
else
{
return false;
}
}
int length_list(PNODE pHead) //求链表长度
{
PNODE p = pHead->pNext;
int len = 0;
while (NULL != p)
{
++len;
p = p->pNext;
}
//printf("\n");
return len;
}
bool insert_list(PNODE pHead, int pos, int val)
{
PNODE p = pHead;
if(NULL == p->pNext)
{
printf("The list is NULL!!!\n");
return false;
}
else if (pos < 1 || pos >length_list(pHead))
{
printf("Please input right list length!!!\n");
return false;
}
else
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("pNew distribute error!!!\n");
exit (-1);
}
for (int i = 0; i < pos-1; i++)//pos=1,p=pHead
{
p = p->pNext;
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
}
bool delete_list(PNODE pHead, int pos, int * pVal) //删除链表第pos个节点,并将删除的结点的值存入pVal所指向的变量中, 并且pos的值是从1开始
{
PNODE p = pHead;
if(NULL == p->pNext)
{
printf("The list is NULL!!!\n");
return false;
}
else if (pos < 1 || pos >length_list(pHead))
{
printf("Please input right list length!!!\n");
return false;
}
else
{
for (int i = 0; i < pos-1; i++)//pos=1,p=pHead
{
p = p->pNext;
}
*pVal = p->data;//把要删除的数传回去
PNODE q = p->pNext; //要手动释放删除的空间
p->pNext = q->pNext;
free(q);
return true;
}
}
数据结构对链表的操作
最新推荐文章于 2023-07-20 20:50:14 发布