纯c语言实现链表,实现链表增删改查
来源:互联网 发布:卷积矩阵及其运算实例 编辑:程序博客网 时间:2024/06/05 06:41
#include <stdio.h>#include <string.h>#include <stdlib.h>struct selflist{ int num; selflist* next;};struct selflist* head = NULL;//根据大小创建链表void init(int size){ struct selflist* tmp = NULL;struct selflist* tail = NULL;head = (struct selflist*) malloc(sizeof(struct selflist));if(NULL==head){ printf("初始化链表头失败\n"); return;}head->next = NULL;tmp = head;for(int i = 0; i < size-1; i++){tmp->num = i;//rand();tmp->next = NULL;tail = tmp;tmp = tmp->next;tmp = (struct selflist*) malloc(sizeof(struct selflist));if(NULL==tmp){ printf("初始化临时链表失败\n"); return;}tail->next = tmp;} ///最后一个无须在malloc空间tail->next->num = size-1;tail->next->next = NULL;}//释放链表的每个节点void FreeList(){ if(NULL==head) return;struct selflist* tmp = head->next;while(head){ free(head);head=NULL;if(tmp){head = tmp;tmp = tmp->next;}}}//末尾插入元素void insert(int num){ struct selflist* tmp = head; while(tmp){ if(NULL == tmp->next){ struct selflist* insert = (struct selflist*) malloc(sizeof(struct selflist)); if(insert){ insert->num = num; insert->next = NULL; tmp->next = insert; }else{ printf("加入数据失败\n"); } return; } tmp = tmp->next; } }//指定位置加入数据void insert_ex(int num, int pos){ //pos从0开始,如pos=0,则表示在head前加入一个元素int size=0;struct selflist* tmp = head;//临时复制head,对tmp操作只是不会影响head仍然指向头while(tmp){ ++size; tmp = tmp->next;}if(pos<0 || pos>=size) {//加入链表末尾 insert(num);}else{ size = 0; struct selflist* insert = (struct selflist*) malloc(sizeof(struct selflist)); if(!insert){ printf("指定位置加入元素失败\n"); return; } insert->num = num; insert->next = head; if(pos==size){ head = insert; return; } tmp = head; struct selflist* p = NULL; while(tmp){ if(pos-1==size){ p = tmp->next; tmp->next = insert; insert->next = p; return; } tmp = tmp->next; ++size; }}}//删除指定位置元素void deletelist(int pos){if(NULL==head) return;if(pos==0){ struct selflist* p = head; struct selflist* t = head->next; free(p); p=NULL; head = t; return;}int size=0;struct selflist* tmp = head;while(tmp){ ++size; tmp = tmp->next;}if(pos<0 || pos>=size){//删除末尾 pos = size-1;}tmp = head;size = 0;while(tmp){if(pos-1==size){struct selflist* p = tmp->next->next;free(tmp->next);tmp->next = NULL;tmp->next = p;return;}tmp = tmp->next;++size;}}//删除指定元素void deletenum(int num, bool flag){ //flag:true//删除所有为num的元素 //flag:false//只删除找到第一个num的元素 if(NULL==head) return; struct selflist* tmp = head; int size=0; while(tmp){ ++size; if(tmp->num == num){ deletelist(size-1); tmp = tmp->next; if(flag) continue; else break; } tmp = tmp->next; }}/* 位置从0开始 flag:true://找所有num flag:false;//找第一个num*/void findnum(int num, bool flag){ if(NULL==head) return;struct selflist* tmp = head;int size = 0;while(tmp){if(tmp->num == num){ printf("找到%d元素,位于链表第%d位置\n",num,size); tmp = tmp->next; if(flag) continue; else break;}tmp = tmp->next;++size;}}//打印链表void Print(){struct selflist* tmp = head;while(tmp){ printf("%d\n",tmp->num); tmp = tmp->next;}}//链表倒序void reverse(){ if(NULL==head) return;struct selflist* s = NULL;struct selflist* t = head->next;//保存当前链表地址,head的改变不会影响此时的t,但t的改变会影响headwhile(head){head->next = s;//指向前一个节点s = head;//前一个节点,这个head为前面的head->next的head即新的链表head = t;//下一个节点,这个head为原来的head只是变为head->next即原来的链表if(NULL==t) break;//说明是最后一个节点了。if(head){ t = head->next;//得到下一个节点} }head = s;}
0 0
- 纯c语言实现链表,实现链表增删改查
- c语言-指针实现链表增删改查
- C语言实现双向链表,增删改查,排序
- C语言链表,增删改查
- 用Java语言实现链表的增删改查
- C语言实现顺序表增删查改操作
- C语言实现对顺序表的增删改查
- java实现链表,增删改查
- 第一次写C语言链表的增删改查
- C语言建立链表以及增删改查
- c语言链表的增删改查
- 数据结构之链表实现增删改查
- 链表的基本操作的实现---- 增删改查
- C++链表的增删改查实现原理
- C链表的增删查改
- 【转】PostgreSQL 数据库C语言代码实现【数据库连接,创建表, 以及增删改查】
- C语言实现顺序表的增删查改以及排序
- 用C语言实现顺序表的增删查改和逆置
- android_27_get请求提交数据_HttpURLConnection
- HTTP状态码
- HTTP Request
- 2016年全年总结
- Myeclipse 快捷键大全(绝对全)
- 纯c语言实现链表,实现链表增删改查
- servlet的url-pattern匹配规则
- xp系统升级win7系统教程
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
- Android自定义一个广播接收器BroadcastReceiver监听系统wifi连接
- RenderTexture
- android 手写签名、画板(自定义视图)的使用
- 回文子串
- 使用application实现网页计数器