单链表的C语言实现

被刻印的时光 ゝ 提交于 2019-11-28 20:13:11

目录

整表创建

头插法

尾插法

整表删除

插入单个节点

删除单个节点


头插法

 Link tcreatelist()
 {
 	int value,len;
 	Link head = (Link)malloc(sizeof(link));//先创建头结点,头结点的数据域没有值
 	head->next = NULL;                     //使头结点下一个节点指向NULL
 	printf("input the node you want!!\n");
 	scanf("%d",&len);                      //输入要输入链表的长度
 	for(int i=0;i<len;i++)
 	{
 		scanf("%d",&value);
 		Link a = (Link)malloc(sizeof(link));//创建新结点
 		a->data=value;                      //将输入值赋给这个结点的数据域
 		a->next=head->next;                 //让这个新结点的下一个结点指向头结点的下一个结点
 		head->next=a;		                //让头结点的下一个结点指向这个新结点
	}
	return head;                            //返回链表头
 }

尾插法

   

Link wcreatelist()
{
 	int value,len;
 	Link head = (Link)malloc(sizeof(link)); //表示头结点 
 	Link tail = head;                       //定义一个尾指针,这个尾指针也指向这个头结点
 	head->next = NULL;                      //头结点的下一个结点指向NULL
 	scanf("%d",&len);                       //输入链表的长度
 	for(int i =1;i<=len;i++)
 	{
 	    Link a = (Link)malloc(sizeof(link));//创建新结点
 		scanf("%d",&value);                 //输入结点中要保存的值
 		a->data = value;                    //将这个值赋给新结点的数据域
 		a->next = NULL;                     //使该结点的下一结点指向NULL
 		tail->next = a;	                    //尾节点的下一结点指向新结点a
 		tail = a;                           //将尾节点指向a
	 }
    return head;                            //返回头指针
 }

整表删除

 Link delelist(Link linklist) 
 {
 	Link node,q;
 	node = linklist->next;        //首先让node指向首结点(注意不是头结点)
	while(node)                   //遍历除头结点之外的所有结点
	{
		q=node->next;             //让q结点指向下一结点,如果不保存下面就找不到下一结点了
		free(node);               //释放掉node结点,删除了这个结点,释放了其所占的内存
		node = q;                 //使node指向刚刚保存的下一结点
	} 
 	linklist->next = NULL;        //将首节点置为空 
 	return linklist;
 }

插入单个节点

 Link insertnode(Link linklist,int num,int value) //第一个参数表示链表的头指针,第二个表示插入
                                                  //的位置,第三个为要插入的值
 {        
 	Link head = linklist;                         //定义一个head指针,让该指针指向链表的头结点
 	Link addnode = (Link)malloc(sizeof(link));    //为要插入的结点动态分配内存
 	for(int i =0;i<(num-1);i++)
 	{
 		head = head->next;                        //遍历到要插入位置的前一个结点,让head指向该
                                                  //结点
	}
	addnode->data = value;                        //将传入的数值给新建节点的数字域
	addnode->next = head->next;                   //让新建结点的下一个结点指向原链表中要插入位
                                                  //置处的结点
	head->next = addnode;                         //让要插入位置的上一个结点的next指向这个新结
                                                  //点
	return linklist;                              //返回这个链表
 }

删除单个结点(注意要保存那个要删除的结点,然后还要释放掉这个结点,如果不释放,会一直占内存)

 Link delenode(Link linklist,int num)  // 第一个参数表示链表,第二个参数表示要删除的是链表中的第
                                       //几个结点
 {
 	Link head = linklist;              //定义一个指针,使其指向链表的头结点,用来遍历
 	Link q;                            //定义一个指针用来保存要删除的结点 
 	for(int i=0;i<(num-1);i++)
 	{
 		head = head->next;	           //找到要删除的结点的前一个结点
	 }
	q = head->next;                    //让q指针指向要删除的这个结点
	head->next=q->next;                //改变前一结点指针的指向,使其指向要删除结点的下一结点
	free(q);                           //删除数据,释放该结点的内存
	return linklist;                   //返回删除后的链表头结点
	 
 }

主函数(实现链表的输出打印)

 #include "stdio.h"
 #include "stdlib.h"
 typedef struct Node
 {
 	int data;
 	struct Node *next;
 }link,*Link;
int main()
 {
 	int num=0;
 	Link arrayc,arrayd,arraya,arrayda;
	arrayc = tcreatelist();
	arrayd = delenode(arrayc,3);
	arraya = insertnode(arrayc,3,18);
	arrayda =  delelist(arraya);
	printf("输出链表:\n");
	arrayda = arrayda->next;                 //因为头结点是空的,因此要指向下一结点即首结点打印
	if(arrayda!=NULL)
	{
		do
	    {
			printf("%d,%d\n",num,arrayda->data);
			num++;
			arrayda=arrayda->next;   
     	}while(arrayda!=NULL);
	}	
 	return 0;
 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!