c语言链表基本操作
来源:互联网 发布:芮纳纪 淘宝 编辑:程序博客网 时间:2024/05/20 09:21
对于c语言链表的增删改查
#include <stdio.h>#include <stdlib.h>#include<malloc.h>#define true 1#define false 0typedef int bool;typedef struct Node{ int val; struct Node * next;}NODE,*PNODE;//函数声明void traverse_list(PNODE pHead);PNODE create_list(void);bool is_empty(PNODE);int length_list(PNODE);bool insert_list(PNODE,int,int);bool delete_list(PNODE,int,int*);void sort_list(PNODE);//对链表元素进行排序void sort_list(PNODE pHead){ int len = length_list(pHead); if(len<=1) { printf("链表元素太少,无法执行排序操作"); return; } int i,j,temp; PNODE p ; //现在 p 指向的是首节点 for(i=0;i<len;i++) { p = pHead->next; // 每一次循环执行时,需要从当前首节点向后执行 for(j=0;j<len-i-1;j++) { if(p->val < p->next->val) { temp = p->val; p->val = p->next->val; p->next->val = temp; } p = p->next; } }}//删除某个元素bool delete_list(PNODE pHead ,int pos,int* val){ //以下的条件判断方法很巧妙 int i = 0; PNODE p = pHead; while(NULL!=p->next&&i<pos-1) { p= p->next; i++; } if(i>pos-1 || NULL == p->next) { return false; } PNODE r = p->next; // 用 r 记住后,用来释放内存,防止内存泄露 *val = p->next->val; p->next = p->next->next; free(r); r = NULL; return true;}//插入某个元素bool insert_list(PNODE pHead,int pos,int value){ int i = 0; PNODE p = pHead; while(NULL!=p->next&&i<pos-1) { p= p->next; i++; } if(i>pos-1 || NULL ==p->next) { return false; } //程序执行到这个地方时,说明已经找到了要插入的位置 PNODE q = (PNODE)malloc(sizeof(NODE)); if(NULL == q) { printf("内存分配失败,程序将退出"); exit(-1); } q->val = value; q->next = p->next; p->next = q; return true;}//求链表的长度int length_list(PNODE pHead){ int len=0; PNODE p = pHead; while(NULL != p->next) { len++; p = p->next; } return len;}bool is_empty(PNODE pHead){ if(NULL == pHead->next) { return true; } else { return false; }}//构造链表PNODE create_list(void){ int len,i,value; printf("请输入您要创建的链表中的元素个数 len = "); scanf("%d",&len); PNODE pHead = (PNODE)malloc(sizeof(NODE)); // 最后需要返回的头指针 pHead->next=NULL; PNODE pTail = pHead; // 最开始的时候尾指针指向头指针,因为元素个数为零。 for(i=0;i<len;i++) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); //分配一个新节点 printf("请输入第%d个元素中的value值 value = ",i+1); scanf("%d",&value); pNew->val = value; //构造新节点的值 pNew->next = NULL; // 构造新节点的指针域 pTail->next = pNew; // 将新节点挂到尾节点上 pTail = pNew; //更新尾节点,新挂上的节点为尾节点 } return pHead;}//遍历整个链表,并输出void traverse_list(PNODE pHead){ PNODE p = pHead->next; while(NULL != p) { printf("%d ",p->val); p = p->next; } printf("\n");}//主函数int main(){ PNODE pHead = create_list(); traverse_list(pHead); if(is_empty(pHead)) { printf("empty\n"); } else { printf("not empty\n"); } printf("------------------------------------------\n"); int len = length_list(pHead); printf("链表的长度为 %d \n",len); printf("------------------------------------------\n"); int val,pos; printf("请输入您要插入的位置 pos = "); scanf("%d",&pos); printf("请输入您要插入的数据 val = "); scanf("%d",&val); insert_list(pHead,pos,val); printf("------------------------------------------\n"); printf("插入数据后的链表为\n"); traverse_list(pHead); printf("------------------------------------------\n"); printf("请输入您要删除的元素的位置为:"); scanf("%d",&pos); while(!delete_list(pHead,pos,&val)) { printf("删除失败,请重新输入要删除元素的位置"); scanf("%d",&pos); } printf("删除后的链表遍历为:\n"); traverse_list(pHead); printf("您删除的位置所在处的元素为:%d \n",val); printf("------------------------------------------\n"); sort_list(pHead); printf("排序后的链表输出为:\n"); traverse_list(pHead); return 0;}
1 1
- C语言链表基本操作
- C语言链表的基本操作
- C语言链表常见基本操作
- C语言链表的基本操作
- C语言实现链表基本操作
- c语言链表基本操作
- 链表的基本操作[C语言]
- C语言链表基本操作
- 双向链表的基本操作(C语言)
- C语言实现双向链表的基本操作
- C语言实现双向链表的基本操作
- 最基本的单向链表操作 C语言
- 双向循环链表基本操作(C语言)
- C语言--链表基本操作(课时5)
- c语言实现静态链表的基本操作
- c语言实现循环链表的基本操作
- c语言实现双向链表的基本操作
- 单向链表基本操作(C语言实现)
- pat B1063
- Android中的广播机制
- UVA12657 移动盒子 链表
- 逆向工程核心原理学习笔记(十):IA-32寄存器基本讲解
- C/C++中带空格的字符串的输入
- c语言链表基本操作
- 二分类专多分类
- HDU5137 How Many Maos Does the Guanxi Worth
- PAT B1062
- 语句整理
- sdut2879——Colorful Cupcakes(枚举终点记忆化搜索)
- 依赖注入那些事儿
- OpenCV中Ptr<>的应用的几点问题
- spark学习之路----配置spark编译源码,准备阅读环境