数据结构之单链表(C语言)

单链表的静态创建、动态创建(头插法、尾插法)及增删改操作

#include <stdio.h>
#include <stdlib.h>

/*链表-普通结构体的应用
定义:
灵活的数据结构(数据存放的思想)
数组为连续内存空间的数据结构,增删改不灵活,运算量大
*/

//自定义链表节点结构体,定义为Node类型
typedef struct node_link{
	char data;
    struct node_link *next;
}Node;

//链表遍历输出 in:Node *head ;out:void
void printfLink(Node *head){
	Node *node=head;
    while(node!=NULL){
			printf(" %d ",node->data);
            node=node->next;
    }
    printf("\n");
}

/*插入节点:节点前方插入;节点后方插入
in:Node *head,int data,Node *new_node
out:*head;
链表的头节点可以确定整个链表
*/
Node* insertFromForward(Node *head,int data,Node *new_node){
	Node *node=head;
    if(data==head->data){
		new_node->next=head;
        printfLink(new_node);
        return new_node;
    }
    while(node!=NULL){
		if(data==node->next->data){
			new_node->next=node->next;
            node->next=new_node;
            printfLink(head);
            return head;
        }
        node=node->next;
    }
}
Node* insertFromBehide(Node *head,int data,Node *new_node){
	Node *node=head;
    while(node!=NULL){
		if(node->data==data){
			new_node->next=node->next;			
            node->next=new_node;
            printfLink(head);
            return head;
        }
		node=node->next;
    }
}
//删除节点
Node* deleteNode(Node* head,int data){
	Node* node=head;
    while(node!=NULL){
		if(node->next->data==data){
			node->next=node->next->next;  
            printfLink(head);
            return head;      
        }
        node=node->next;
    }
}
//更新节点值
Node* updateNode(Node *head,int data,int new_data){
	Node *node=head;
    while(node!=NULL){
		if(node->data==data){
			node->data=new_data;
            printfLink(head);
            return head;
        }
        node=node->next;
    }
		printf("the data is not in Link\n");
		return head;

}

/*
动态创建链表
	头插法
    尾插法
    一个一个插入,输入0结束
*/
Node* insertFromHead(Node *head,Node *new_node){
	//printf("Head\n");
	if(head==NULL){
		head=new_node;
    }
    else{
		new_node->next=head;
        head=new_node;
    }
    return head;
}
Node* insertFromTail(Node *head,Node *new_node){
	//printf("Tail");
    Node *node=head;
    if(head==NULL){
		head=new_node;
    }
    else{
		while(node!=NULL){
			if(node->next==NULL){
				node->next=new_node;
                return head;
			}
			node=node->next;
		}
    }
	return head;
}

Node* creatLink(Node *head,char flag[]){
        Node *new_node=NULL;
		printf("the src link is ");
        printfLink(head);
		while(1){
			new_node=(Node*)malloc(sizeof(Node));//开辟内存空间并指向其首地址;			
			printf("please input your new node data\n");
            scanf("%d",&(new_node->data));     
            new_node->next=NULL;//无修改则默认为尾结点	
			if(new_node->data==0){
                free(new_node);
                printf("0:quit;   creat link by %s, link result is  ",flag);
                printfLink(head);
                return head;
            }
            if(flag=="Head")
				head=insertFromHead(head,new_node);
            if(flag=="Tail")
				head=insertFromTail(head,new_node);  
        }
}


int main()
{
	/*链表静态创建*/
	//创建节点
    Node node1={1,NULL};
    Node node2={2,NULL};
    Node node3={3,NULL};
    //将节点链起来
    node1.next=&node2;
    node2.next=&node3;
	//printf("node1's data %d; node2's data %d;\n",node1.data,node1.next->data);//变量名用.,指针用->访问成员
    printfLink(&node1);//遍历打印
        
    
    /*增加节点*/
    Node node4={100,NULL};
    Node *head=&node1;
    head=insertFromForward(&node1,1,&node4);//返回的是一个指针(地址)
    Node node5={101,NULL};
    head=insertFromForward(&node1,3,&node5);
    
    Node node6={103,NULL};
    head=insertFromBehide(&node1,3,&node6);	
    
    /*删除节点*/
    head=deleteNode(&node1,103);	
    
    /*改变节点值*/
    head=updateNode(&node1,103,10);	
    head=updateNode(&node1,101,10);	

    /*链表动态创建*/
    Node *head1=NULL;
    char *flag="Head";
    //头插法
    printf("head insert\n");
    head1=creatLink(head1,flag);
    //尾插法
    printf("tail insert\n");
    flag="Tail";
    head1=creatLink(head1,flag);
   
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值