文章目录
- 链表综合程序
-
- 主函数
- 创建链表函数
- 遍历链表函数
- 判断链表是否为空函数
- 判断链表的长度函数
- 在链表中插入结点函数
- 对链表中的数据排序函数
- 删除链表中的结点函数
- 完整程序
链表综合程序
主函数
# include
# include
# include
typedef struct Node
{
int data;
struct Node * pNext;
}NODE, *PNODE;
PNODE Create_list(void);
void Traverse_list(PNODE);
bool Is_empty(PNODE);
int Length_list(PNODE);
bool Insert_list(PNODE, int, int);
bool Delete_list(PNODE, int, int *);
void Sort_list(PNODE);
int main(void)
{
PNODE pHead = NULL;
int val;
printf("----------------创建链表----------------\n");
pHead = Create_list();
printf("\n----------------遍历链表----------------\n");
printf("链表中的元素为:\n");
Traverse_list(pHead);
printf("------------判断链表是否为空------------\n");
if(Is_empty(pHead))
printf("链表为空!\n");
else
printf("链表非空!\n");
printf("----------------插入元素----------------\n");
Insert_list(pHead, 3, 25);
printf("链表中的第3个位置插入元素25后,链表为:\n");
Traverse_list(pHead);
printf("----------------元素排序----------------\n");
Sort_list(pHead);
printf("对链表中的元素进行排序后为:\n");
Traverse_list(pHead);
printf("--------------判断链表长度--------------\n");
int len = Length_list(pHead);
printf("链表长度为:%d\n", len);
printf("----------------删除元素----------------\n");
if(Delete_list(pHead, 2, &val))
printf("删除的是第2个元素:%d\n删除成功!\n", val);
else
printf("删除失败!\n");
printf("删除后链表中的元素为:\n");
Traverse_list(pHead);
return 0;
}
创建链表函数
PNODE Create_list(void)
{
int len;
int i;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("分配失败!程序终止!\n");
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));
if (NULL == pNew)
{
printf("分配失败!程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
- 使用malloc函数动态分配一个头指针(pHead),指向首结点
- if语句判断头指针是否分配成功(NULL==pHead)
- 使用malloc函数动态分配一个尾指针(pTail),指向尾结点
- if语句判断尾结点是否分配成功(NULL==pHead)
- 当链表中只有一个结点时,pTal就等于pHead,且指针域为空(NULL)
- 使用for循环,对链表的长度以及元素进行赋值
- 在循环体内,再动态分配一个临时结点(pNew),用于临时存放新加入结点的数据
- 将用户输入的值赋值给pNew中的data,同时把pNew中的指针域清空(pNext=NULL)
- 再使pTail中的pNext指向pNew,即将pNew挂在首结点后
- 使pTail的值等于pNew,即pTail指向尾结点
- 最后返回pHead,即存指向首结点的指针
遍历链表函数
void Traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL != p)
{
printf("%d ", 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;
}
return len;
}
在链表中插入结点函数
bool Insert_list(PNODE pHead, int pos, int val)
{
int i = 0;
PNODE p = pHead;
while(NULL != p && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || NULL == p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
- 将插入结点的数据赋值给pNew中的data
- 定义临时结点指针q,用于存放p原本指向的下一个结点
- 将p中的pNext指向新分配的存放数据的临时结点(pNew)
- 将pNew中的pNext指向q,即原本p指向的下一个结点
对链表中的数据排序函数
void Sort_list(PNODE pHead)
{
int i, j, t;
int len = Length_list(pHead);
PNODE p, q;
for (i = 0, p = pHead->pNext; i < len - 1; i++, p = p->pNext)
{
for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}
删除链表中的结点函数
bool Delete_list(PNODE pHead, int pos, int * pVal)
{
int i = 0;
PNODE p = pHead;
while(NULL != p->pNext && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || NULL == p->pNext)
return false;
PNODE q = p->pNext;
*pVal = q->data;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
完整程序
# include
# include
# include
typedef struct Node
{
int data;
struct Node * pNext;
}NODE, *PNODE;
PNODE Create_list(void);
void Traverse_list(PNODE);
bool Is_empty(PNODE);
int Length_list(PNODE);
bool Insert_list(PNODE, int, int);
void Sort_list(PNODE);
bool Delete_list(PNODE, int, int *);
int main(void)
{
PNODE pHead = NULL;
int val;
printf("----------------创建链表----------------\n");
pHead = Create_list();
printf("\n----------------遍历链表----------------\n");
printf("链表中的元素为:\n");
Traverse_list(pHead);
printf("------------判断链表是否为空------------\n");
if(Is_empty(pHead))
printf("链表为空!\n");
else
printf("链表非空!\n");
printf("----------------插入元素----------------\n");
Insert_list(pHead, 3, 25);
printf("链表中的第3个位置插入元素25后,链表为:\n");
Traverse_list(pHead);
printf("----------------元素排序----------------\n");
Sort_list(pHead);
printf("对链表中的元素进行排序后为:\n");
Traverse_list(pHead);
printf("--------------判断链表长度--------------\n");
int len = Length_list(pHead);
printf("链表长度为:%d\n", len);
printf("----------------删除元素----------------\n");
if(Delete_list(pHead, 2, &val))
printf("删除的是第2个元素:%d\n删除成功!\n", val);
else
printf("删除失败!\n");
printf("删除后链表中的元素为:\n");
Traverse_list(pHead);
return 0;
}
PNODE Create_list(void)
{
int len;
int i;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("分配失败!程序终止!\n");
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));
if (NULL == pNew)
{
printf("分配失败!程序终止!\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void Traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while(NULL != p)
{
printf("%d ", 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;
}
return len;
}
bool Insert_list(PNODE pHead, int pos, int val)
{
int i = 0;
PNODE p = pHead;
while(NULL != p && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || NULL == p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
void Sort_list(PNODE pHead)
{
int i, j, t;
int len = Length_list(pHead);
PNODE p, q;
for (i = 0, p = pHead->pNext; i < len - 1; i++, p = p->pNext)
{
for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}
bool Delete_list(PNODE pHead, int pos, int * pVal)
{
int i = 0;
PNODE p = pHead;
while(NULL != p->pNext && i < pos - 1)
{
p = p->pNext;
i++;
}
if (i > pos - 1 || NULL == p->pNext)
return false;
PNODE q = p->pNext;
*pVal = q->data;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
以上内容均属原创,如有不详或错误,敬请指出。
本文作者:
坏坏
本文链接: https://blog.csdn.net/qq_45668124/article/details/117173082
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请联系作者注明出处并附带本文链接!