纯c语言实现链表,实现链表增删改查

原创 2017年01月03日 14:24:18
#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的改变会影响head
	
	while(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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言双链表,可实现增删改查功能,还可以将链表反转。

#include #include #include int  number=0; typedef struct Node { int data; struct Node *next; struct ...

C语言链表,增删改查

代码地址:https://code.csdn.net/u012995856/shujujiegou/tree/master/basicDataStructure/myLinkedList.c运行:代码...

动态链表的增删改查,打印销毁等基本操作及代码模块化(完整C语言代码!)

链表的增删改查,打印销毁等等基本操作 代码模块化 所有操作实现的完整C语言代码

用Java语言实现链表的增删改查

用Java语言实现链表的增删改查

用java实现双向循环链表的增删改查

用java实现双向循环链表的增删改查

链表的基本操作的实现---- 增删改查

/** *  编写:中医熊猫 *  时间:20150801 *  初次编写,还望指教 */ #include #include #define LEN sizeof(stru...

JAVA实现单链表的增删改查

前言实现参考:http://blog.csdn.net/hitwhylz/article/details/12305021http://www.cnblogs.com/smyhvae/p/476159...

数据结构实验1 链表 实现学生信息存储,功能 增删改查,实现 结构类型

//一共三个结构,一个是学生的信息即struct Stu包括学生的基本信息和显示信息建立信息的函数, //一个是节点struct Node,包括数据项学生和指针域 //一个是链表struct Line...

链表的增删改查

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)