单链表的C语言实现

目录

整表创建

头插法

尾插法

整表删除

插入单个节点

删除单个节点

单链表逆序



头插法

 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;                   //返回删除后的链表头结点
	 
 }

单链表逆序实现

 Link revertlink(Link linklist)
 {
 	Link head = linklist;         //新建一个指针结点,使该结点指向链表头
 	Link tail=NULL;               //定义一个尾指针 
  	Link node = NULL;	          //用来指向要逆序的那个结点		  
   	Link q    = NULL;             //用来遍历未逆序的结点
    Link reserve = NULL;          //定义一个结点,用来指向还未逆序的首结点 
 	tail = head;                  //让尾指针指向头指针 
 	while(1)
 	{
 	 	reserve = tail->next;            //reserve指向还未逆转的链表列 
 	 	q       = tail->next;            //该指针用来遍历 
 	 	//printf("the value of q is %d\n",q->data);
    	//node = head->next;             //需要有一个结点记录尾结点的前一个结点 
     	do
       {
       	    if(q->next==NULL)            //如果只剩一个结点 
       	    {
       	    	node = q;                //node始终指向要逆序的那个结点,即未逆序链表的尾节点
       	    	break;
			}
			else if(q->next->next==NULL) //如果只剩两个结点
			{
				node = q->next;
				break;
			}               
            else
            {
            	q=q->next;
            	node = q->next;
			}
       }while(q->next->next!=NULL);            //q指向的是链表的尾结点的前一个结点 
        q->next = NULL;
	    if(node == reserve)
	    {
	    	node->next=NULL;
	    	tail->next = node;
	    	tail = node;
	    	break;
		}
		else
		{
			node->next=reserve;                   //node结点的下一结点指向还未逆序的首结点 
            tail->next=node;                      //插入这个尾节点 
	    	tail = node;                          //尾节点指向新插入的结点
	    //	printf("%d,%d\n",tail->data,node->data);
		}
	}		
    return linklist;
 } 

输出打印链表

 int printflist(Link linklist)
 {
  	int num=0;
 	printf("输出链表:\n");
 	Link array = linklist;
	array = array->next;//因为头节点是空的 
	if(array!=NULL)
	{
		do
	    {
			printf("%d,%d\n",num,array->data);
			num++;
			array=array->next;   
     	}while(array!=NULL);
	}
	return 0;	
 }

主函数()

 #include "stdio.h"
 #include "stdlib.h"
 typedef struct Node
 {
 	int data;
 	struct Node *next;
 }link,*Link;
 int main()
 {
 	Link arrayc,arrayd,arraya,arrayda,arrayr;
 	
 	//返回首地址 
	arrayc = tcreatelist();
	//打印输入的数组
	printflist(arrayc); 
    //arraya = insertnode(arrayc,3,18);
    //实现单链表逆序
    arrayr = revertlink(arrayc);
    //打印逆序结果
    printflist(arrayr); 
	//arrayda =  delelist(arraya);
 	return 0;
 }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值