C语言单链表制造逐步详解

说明

  • 按照序号从头向下看即可,功能在标题里,具体构造方法以及说明在注释里面
  • 这只是构建链表的其中一种方法
  • 其中代码构建的均为单链表
  • 3号是基本的链表,不带其他多余功能
  • 8号是加上所有功能后的链表示例
  • 这个只能算是示例以及练习的代码,使用的时候还需要修改
  • 而且没有做容错!没有做容错!没有做容错!
  • 只是单纯得想展示一下怎么去构建一个基本的链表
  • 实话实说,这个代码有点憨批,但是应该比较适合初学者来看一看
  • 还有就是如果有错误以及可以进一步改进的方法,还请提出来,万分感谢Orz

具体代码

1号 单主程序无函数单链表

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;


int main()
{
	int line[10];
	int i = 0;
	Shop *Lhead = NULL;
	/*输入数字*/ 
	printf("***************************************************");
	printf("\n请输入四个数字:");
	for (i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);	
	}
	/*建立链表*/
	for (i = 0; i < 4; i++)
	{
		/*设置新节点*/
		Shop *p = (Shop*)malloc(sizeof(Shop));
		p->data = line[i];
		p->next = NULL;
		/*链接节点*/
		Shop *last = Lhead;/*初始last在表头*/ 
		if(last)/*如果表头节点不为空*/
		{
			/*从头到尾遍历链表,直到确定到最后一个节点*/
			while(last->next)
			{
				last = last->next;
			}
			/*将最后一个节点的next指针指向p*/ 
			last->next = p;
		}
		else/*如果表头节点为空*/ 
		{
			Lhead = p;
		}	
	} 
	/*打印整幅链表*/
	while (Lhead)
	{
		printf("%d ", Lhead->data);
		Lhead = Lhead->next;
	}/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	return 0;
} 

2号 函数:制造,全部打印,单链表,初级

#include <stdio.h>
#include <malloc.h> 
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
typedef struct _list
{
	int data;
	struct _list *next; 
}Shop;

void creat(Shop *&list, int a);/*建立链表*/
void printall(Shop *&list);/*打印整幅链表*/

int main()
{
	int i = 0;
	int line[100];
	Shop *head = NULL;
	/*输入数字*/ 
	printf("******************************************");
	printf("\n请输入四个数字:");
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/
	for(i = 0; i < 4; i++)
	{
		creat(head, line[i]);
	}
	/*打印*/
	printall(head);
	
	return 0;
}

void creat(Shop *&list, int a)
{
	/*设置新节点*/
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL;
	/*链接节点*/
	Shop *last = list;/*初始last在表头*/ 
	if(last)/*如果表头节点不为空*/
	{
		/*从头到尾遍历链表,直到确定到最后一个节点*/
		while (last->next)
		{
			last = last->next;
		}
		/*将最后一个节点的next指针指向p*/ 
		last->next = p; 
	}
	else/*如果表头节点为空*/ 
	list = p;
	
}

void printall(Shop *&list)
{
	Shop *last = list;
	while(last)
	{
		printf("%d ", last->data);
		last = last->next;
	}/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
}

3号 函数:制造,全部打印,单链表,二级

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/ 
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 

int main()
{
	int i = 0;
	int line[100];
	List list;
	list.head = NULL; 
	/*输入数字*/ 
	printf("*************************************");
	printf("\n请输入四个数字: "); 
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*打印*/
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL;
	/*链接节点*/ 
	Shop *last = plist->head;/*初始last在表头*/ 
	if(last)/*如果表头节点不为空*/ 
	{
		/*从头到尾遍历链表,直到确定到最后一个节点*/ 
		while (last->next)
		{
			last = last->next;
		}
		/*将最后一个节点的next指针指向p*/ 
		last->next = p;
	}
	else/*如果表头节点为空*/ 
	{
		plist->head = p;
	} 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	while (last)
	{
		printf("%d ", last->data);
		last = last->next;
	}/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
} 

4号 函数:制造,全部打印,单链表,三级

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
	Shop *tail;/*指向链表最后一个节点*/ 
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 

int main()
{
	int i = 0;
	int line[100];
	List list;
	list.head = list.tail = NULL; 
	/*输入数字*/ 
	printf("*************************************");
	printf("\n请输入四个数字: ");  
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*打印*/ 
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL; 
	/*链接节点*/ 
	Shop *last = plist->tail;//last代表最后一个节点位置 
	/*使用tail好处:不需要通过遍历链表来找到最后一个节点,节约*/ 
	if(last)
	{
		last->next = p;//链接,将最后一个节点的指针指向新节点 
		plist->tail = p;//标记tail 
	}//如果第一个节点不为0 
	else
	{
		plist->head = p;
		plist->tail = p;
	} //如果第一个节点为0 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	while (last)/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	{
		printf("%d ", last->data);
		last = last->next;
	}
} 

5号 函数:制造,全部打印,time记数,单链表

  • 实话实说,这个是所有代码的里面我觉得写的最失败的一个,没有实用性,最多记个数,实属憨憨。
#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
typedef struct _list
{
	int data;
	int time;/*记数菌 (^ ^)*/ 
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
	Shop *tail;/*指向链表最后一个节点*/ 
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 

int main()
{
	int i = 0;
	int line[100];
	List list;
	list.head = list.tail = NULL; 
	/*输入数字*/ 
	printf("*************************************");
	printf("\n请输入四个数字: ");  
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*打印*/ 
	printf("链表内的数据为:\n"); 
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置last节点*/ 
	Shop *last = plist->tail;//last代表最后一个节点位置 
	/*设置新节点*/
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a; 
	p->next = NULL;
	/*记数*/ 
	if(last == NULL)
	p->time = 0;/*初始化第一个节点数据为0*/
	else
	p->time = last->time + 1;/*上一个节点的time+1*/
	 
	/*链接节点*/ 
	/*使用tail好处:不需要通过遍历链表来找到最后一个节点,节约*/ 
	if(last)
	{
		last->next = p;//链接,将最后一个节点的指针指向新节点 
		plist->tail = p;//标记tail 
	}//如果第一个节点不为0 
	else
	{
		plist->head = p;
		plist->tail = p;
	} //如果第一个节点为0 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	while (last)/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	{
		printf("%d %d\n", last->data, last->time);
		last = last->next;
	}
} 

6号 函数:制造,全部打印,记数打印,查找,单链表

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
/*确实用time记数有点蠢,用time的话插入之后后面的节点中time没办法改变(除非遍历)*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
	Shop *tail;/*指向链表最后一个节点*/ 
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 
void printtime(List *plist, int time);/*打印相关节点的数据*/ 

int main()
{
	int i = 0;
	int line[100];
	int time = 0;
	List list;
	list.head = list.tail = NULL; 
	/*输入数字*/ 
	printf("**********************************************************************");
	printf("\n请输入四个数字: ");  
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*根据节点次序打印所需节点数据*/
	printf("**********************************************************************");
	printf("\n请输入所需打印的数据节点是第几个(节点次序从0开始):"); 
	scanf("%d", &time); 
	printtime(&list, time); 
	
	/*打印全部数据*/ 
	printf("**********************************************************************");
	printf("\n链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL; 
	/*链接节点*/ 
	Shop *last = plist->tail;//last代表最后一个节点位置 
	/*使用tail好处:不需要通过遍历链表来找到最后一个节点,节约*/ 
	if(last)
	{
		last->next = p;//链接,将最后一个节点的指针指向新节点 
		plist->tail = p;//标记tail 
	}//如果第一个节点不为0 
	else
	{
		plist->head = p;
		plist->tail = p;
	} //如果第一个节点为0 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	int i = 0;/*记数*/ 
	/*循环打印各个节点数据,直至最后一个节点*/ 
	while (last)/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	{
		printf("\n%d %d", last->data, i++);
		last = last->next;
	}
} 

void printtime(List *plist, int time)
{
	int i = 0;
	Shop *last = plist->head;
	for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
	{
		last = last->next;
	} 
	/*打印该节点数据*/ 
	printf("\n第%d个节点的数据是:%d\n", time, last->data);
}

7号 函数:制造,全部打印,记数打印,查找,删除,插入,单链表

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
/*确实用time记数有点蠢,用time的话插入之后后面的节点中time没办法改变(除非遍历)*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
	Shop *tail;/*指向链表最后一个节点*/ 
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 
void printtime(List *plist, int time);/*打印相关节点的数据*/ 
void deletetime(List *plist, int time);/*删除相关节点*/  
void inserttime(List *plist, int time, int a);/*在相关节点位置插入数据*/ 

int main()
{
	int i = 0;
	int line[100];
	int data_in = 0; 
	int time = 0;
	int time_2 = 0;
	int time_3 = 0;
	List list;
	list.head = list.tail = NULL; 
	/*输入数字*/ 
	printf("**********************************************************************");
	printf("\n请输入四个数字: ");  
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*根据节点次序打印所需节点数据*/
	printf("**********************************************************************");
	printf("\n请输入所需打印的数据节点是第几个(节点次序从0开始):"); 
	scanf("%d", &time); 
	printtime(&list, time); 
	
	/*打印全部数据*/ 
	printf("**********************************************************************");
	printf("\n链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	/*删除所需节点*/
	printf("\n**********************************************************************");
	printf("\n请输入所需删除的数据节点是第几个(节点次序从0开始):");
	scanf("%d", &time_2); 
	deletetime(&list, time_2); 
	
	/*打印删除节点后的全部数据*/ 
	printf("**********************************************************************");
	printf("\n删除相关节点后当前链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	/*插入所需节点*/
	printf("\n**********************************************************************");
	printf("\n请输入所需插入的数据节点位置(节点次序从0开始):");
	scanf("%d", &time_3); 
	printf("\n请输入所需插入的数据:");
	scanf("%d", &data_in);
	inserttime(&list, time_3, data_in); 
	
	/*打印插入节点后的全部数据*/ 
	printf("**********************************************************************");
	printf("\n插入相关节点后当前链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL; 
	/*链接节点*/ 
	Shop *last = plist->tail;//last代表最后一个节点位置 
	/*使用tail好处:不需要通过遍历链表来找到最后一个节点,节约*/ 
	if(last)
	{
		last->next = p;//链接,将最后一个节点的指针指向新节点 
		plist->tail = p;//标记tail 
	}//如果第一个节点不为0 
	else
	{
		plist->head = p;
		plist->tail = p;
	} //如果第一个节点为0 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	int i = 0;/*记数*/ 
	/*循环打印各个节点数据,直至最后一个节点*/ 
	while (last)/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	{
		printf("\n%d %d", last->data, i++);
		last = last->next;
	}
} 

void printtime(List *plist, int time)
{
	int i = 0;
	Shop *last = plist->head;
	for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
	{
		last = last->next;
	} 
	/*打印该节点数据*/ 
	printf("\n第%d个节点的数据是:%d\n", time, last->data);
}

void deletetime(List *plist, int time)
{
	int i = 0; 
	Shop *before = plist->head;/*前一个节点*/ 
	Shop *behind = plist->head;/*后一个节点*/ 
	if(time == 0)/*如果需要删除的在链表头上*/ 
	{
		/*将原本指向头节点的指针修改为指向1号节点,然后释放内存*/ 
		plist->head = before->next;
		free(before);
	}
	else/*剩余的*/ 
	{		
		/*确定前后节点位置,before为前一个节点,behind为所需删除节点*/ 
		for(i = 0; i < time - 1; i++)/*从头开始循环直至指向所需节点*/ 
		{
			before = before->next;
		} 
		for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
		{
			behind = behind->next;
		} 
		/*将链接链接向behind的下一节点,即将before中原本指向behind的
		指针修改为指向behind的指针所指向的节点(即下一节点),然后释放内存*/ 
		before->next = behind->next; 
		free(behind); 
	}
} 

void inserttime(List *plist, int time, int a)
{
	int i = 0; 
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL;
	
	Shop *before = plist->head;/*前一个节点*/ 
	Shop *behind = plist->head;/*后一个节点*/ 

	/*插入*/ 
	if(time == 0)/*如果需要插入的位置在链表头上*/ 
	{
		/*将原本指向头节点的指针修改为指向新节点,新节点next指向下一个节点*/ 
		plist->head = p;
		p->next = before->next;
	}
	else/*剩余的*/ 
	{		
		/*确定前后节点位置,before为前一个节点,behind为插入后的后一个节点*/ 
		for(i = 0; i < time - 1; i++)/*从头开始循环直至指向所需节点*/ 
		{
			before = before->next;
		} 
		for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
		{
			behind = behind->next;
		} 
		/*将链接链接向新节点,即将before中原本指向behind的指针修改为指向新节点*/ 
		before->next = p;
		p->next = behind; 
	}
}

8号 函数:制造,全部打印,记数打印,查找,删除对应节点,单链表

#include <stdio.h>
#include <malloc.h>
/*链表指针类似于导航的作用,一个接一个,头上第一个初始节点无数据,仅有指针*/  
/*这有点类似一个前台,一个后台,前台我们写入数据,然后储存在后台的链表中,
程序只是相当于一个前台小姐,将我们给她的数据放到后台的一个个柜子里面*/ 
/*说实话这个程序有点蠢,将数据存入数组然后存入链表,这仅作练习使用*/ 
/*确实用time记数有点蠢,用time的话插入之后后面的节点中time没办法改变(除非遍历)*/ 
typedef struct _list
{
	int data;
	struct _list *next;
}Shop;

typedef struct list
{
	Shop *head;
	Shop *tail;/*指向链表最后一个节点*/ 
}List;

void creat(List *plist, int a);/*建立链表*/ 
void printall(List *plist); /*打印整幅链表*/ 
void printtime(List *plist, int time);/*打印相关节点的数据*/ 
void deletetime(List *plist, int time);/*删除相关节点*/  

int main()
{
	int i = 0;
	int line[100];
	int time = 0;
	int time_2 = 0;
	List list;
	list.head = list.tail = NULL; 
	/*输入数字*/ 
	printf("**********************************************************************");
	printf("\n请输入四个数字: ");  
	for(i = 0; i < 4; i++)
	{
		scanf("%d", &line[i]);
	}
	/*建立链表*/ 
	for(i = 0; i < 4; i++)
	{
		creat(&list, line[i]);
	}
	/*根据节点次序打印所需节点数据*/
	printf("**********************************************************************");
	printf("\n请输入所需打印的数据节点是第几个(节点次序从0开始):"); 
	scanf("%d", &time); 
	printtime(&list, time); 
	
	/*打印全部数据*/ 
	printf("**********************************************************************");
	printf("\n链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	/*删除所需节点*/
	printf("\n**********************************************************************");
	printf("\n请输入所需删除的数据节点是第几个(节点次序从0开始):");
	scanf("%d", &time_2); 
	deletetime(&list, time_2); 
	
	/*打印删除节点后的全部数据*/ 
	printf("**********************************************************************");
	printf("\n删除相关节点后当前链表中的所有数据以及它所对应的节点的次序:"); 
	printall(&list);
	
	return 0;
}

void creat(List *plist, int a)
{
	/*设置新节点*/ 
	Shop *p = (Shop*)malloc(sizeof(Shop));
	p->data = a;
	p->next = NULL; 
	/*链接节点*/ 
	Shop *last = plist->tail;//last代表最后一个节点位置 
	/*使用tail好处:不需要通过遍历链表来找到最后一个节点,节约*/ 
	if(last)
	{
		last->next = p;//链接,将最后一个节点的指针指向新节点 
		plist->tail = p;//标记tail 
	}//如果第一个节点不为0 
	else
	{
		plist->head = p;
		plist->tail = p;
	} //如果第一个节点为0 
}

void printall(List *plist)
{
	Shop *last = plist->head;
	int i = 0;/*记数*/ 
	/*循环打印各个节点数据,直至最后一个节点*/ 
	while (last)/*如果你的程序中存在链表为空的情况,切记一定要设置判断,做好准备若链表为空输出什么*/ 
	{
		printf("\n%d %d", last->data, i++);
		last = last->next;
	}
} 

void printtime(List *plist, int time)
{
	int i = 0;
	Shop *last = plist->head;
	for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
	{
		last = last->next;
	} 
	/*打印该节点数据*/ 
	printf("\n第%d个节点的数据是:%d\n", time, last->data);
}

void deletetime(List *plist, int time)
{
	int i = 0; 
	Shop *before = plist->head;/*前一个节点*/ 
	Shop *behind = plist->head;/*后一个节点*/ 
	if(time == 0)/*如果需要删除的在链表头上*/ 
	{
		/*将原本指向头节点的指针修改为指向1号节点,然后释放内存*/ 
		plist->head = before->next;
		plist->tail = before->next;
		free(before);
	}
	else/*剩余的*/ 
	{		
		/*确定前后节点位置,before为前一个节点,behind为所需删除节点*/ 
		for(i = 0; i < time - 1; i++)/*从头开始循环直至指向所需节点*/ 
		{
			before = before->next;
		} 
		for(i = 0; i < time; i++)/*从头开始循环直至指向所需节点*/ 
		{
			behind = behind->next;
		} 
		/*将链接链接向behind的下一节点,即将before中原本指向behind的
		指针修改为指向behind的指针所指向的节点(即下一节点),然后释放内存*/ 
		before->next = behind->next; 
		free(behind); 
	}
} 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值