• 链表(四)——带表头的单向链表


    1.带表头的单向链表
    (1)不带表头的单向链表在实现插入和删除时必须区分头结点和其它节点的处理。


    (2)使用带表头的单向链表的优点:不用考虑头结点的单独处理。
    表头节点:数据域没有值,指针域指向单向链表中数据域含值的第一个结点。


    2.代表头的单向链表的基本操作

    #include <stdio.h>
    #include <malloc.h>
    
    #define NULL	0
    
    typedef struct node {
    	int data;
    	struct node *next;
    }ElemSN;
    
    
    ElemSN * creat_link(int ms); //创建一个带表头的链表
    void print_link(ElemSN *head); //输出单向链表
    void delete_node(ElemSN *head, int x); //删除结点
    void insert_node(ElemSN *head, int x); //插入结点
    void clear_link(ElemSN *head); //删除链表
    
    int main()
    {
    	ElemSN *head;
    	int ms, x;
    
    	printf("Please input node number:");
    	scanf("%d", &ms);
    	head = creat_link(ms); //创建链表
    	print_link(head);
    	printf("Please input delete node:");
    	scanf("%d", &x);
    	delete_node(head, x); //删除结点
    	print_link(head);
    	printf("Please input insert node:");
    	scanf("%d", &x);
    	insert_node(head, x);
    	print_link(head);
    	clear_link(head);
    	print_link(head);
    }
    
    ElemSN * creat_link(int ms) //带表头的单向链表除了头结点其余结点
                                //创建方法一致,所以不用逆向创建
    {
    	ElemSN *h = NULL, *p;
    	int i, x;
    
    	h = p = (ElemSN *)malloc(sizeof(ElemSN));
    	for(i = 0; i < ms; i++)
    	{
    		p->next = (ElemSN *)malloc(sizeof(ElemSN)); //创建新结点
    		printf("Please input node data:");
    		scanf("%d", &x);
    		p->next->data = x; //新结点初始化
    		p->next->next = NULL; //新结点初始化
    		p = p->next;
    	}
    
    	return h;
    }
    
    void print_link(ElemSN *head)
    {
    	if(NULL == head->next)
    	{
    		printf("Link is null.");
    	}
    	for(head=head->next; head; head = head->next)
    	{
    		printf("%d ", head->data);
    	}
    	printf("
    ");
    }
    
    void delete_node(ElemSN *head, int x)
    {
    	ElemSN *p, *q;
    
    	for(p=head, q=head->next; q && q->data != x; p=q, q=q->next){}
    	if(q != NULL)
    	{
    		p->next = q->next;
    		free(q);
    	}
    }
    
    void insert_node(ElemSN *head, int x)
    {
    	ElemSN *p, *q;
    
    	if(NULL == head)
    		return;
    
    	if(NULL == head->next) //链表为空时
    	{
    		head->next = (ElemSN *)malloc(sizeof(ElemSN));
    		head->next->next = NULL;
    		head->next->data = x;
    		return;
    	}
    
    	p = head;
    	q = head->next;
    	if(NULL == q->next) //链表中仅仅有一个元素时
    	{
    		p->next = (ElemSN *)malloc(sizeof(ElemSN));
    		p->next->data = x;
    		p->next->next = q;
    		return;
    	}
    
    	if(q->data >= q->next->data) //递减链表
    	{
    		for(; q && q->data >= x; p = q, q = q->next){}
    	}
    	else //递增链表
    	{
    		for(; q && q->data <= x; p = q, q = q->next){}
    	}
    
    	if(NULL == q) //插入在链表尾部
    	{
    		q = (ElemSN *)malloc(sizeof(ElemSN));
    		q->data = x;
    		q->next = NULL;
    		p->next = q;
    	}
    	else if(q == head->next) //插入在表首
    	{
    		q = (ElemSN *)malloc(sizeof(ElemSN));
    		q->data = x;
    		q->next = head->next;
    		head->next = q;
    	}
    	else //插入在中间位置
    	{
    		p->next = (ElemSN *)malloc(sizeof(ElemSN));
    		p->next->next = q;
    		p->next->data = x;
    	}
    }
    
    void clear_link(ElemSN *head)
    {
    	ElemSN *p;
    
    	while(head->next)
    	{
    		p = head->next;
    		head->next = p->next;
    		free(p);
    	}
    }


  • 相关阅读:
    用例建模Use Case Modeling——传感器智能分析引擎
    结合工程实践分析同类软件产品-抖音快手微视
    为知笔记快捷键
    unity__细碎小知识
    unity__脚本实例化
    unity_GUI
    unity__音频
    关于js获取赋值,遍历属性
    关于节点,jquery的使用以及动画效果
    关于数组,对象,构造器的写法以及事件的使用
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6905199.html
Copyright © 2020-2023  润新知