数据结构:单链表

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


//创建链表
List* CreateList()
{
	List *ls =(List *)malloc(sizeof(List)/sizeof(char));
	
	if(NULL == ls)
		return NULL;
		
//创建头结点	
ls->head =(Node*)malloc(sizeof(Node)/sizeof(char));//为头结点申请空间

if(NULL == ls->head)
{
	free(ls);
	return NULL;
}

ls->head->next = NULL;//空链表



return ls;//返回存放头结点的结构体地址
}


//插入数据:头插
BOOL Insert_Head(List* ls, Data data)
{
	if(NULL == ls)
		return ERROR;
	
	Node *node=(Node*)malloc(sizeof(Node)/sizeof(char));//为新结点分配空间
	
	if(NULL == node)
		return ERROR;
		
	node->data = data;//赋值
	
	node->next = ls->head->next;
ls->head->next = node;



return TRUE;		
}

//插入数据:尾插
BOOL Insert_Last(List* ls, Data data)
{
	if(NULL == ls)
		return ERROR;
	
	Node *node=(Node*)malloc(sizeof(Node)/sizeof(char));//为新节点分配空间
	
	if(NULL == node)
		return ERROR;
	
node->data = data;//赋值
node->next = NULL;//尾部



	Node *tmp = ls->head;
	
	while(tmp ->next)
	{
		tmp =tmp -> next;
	}
	tmp -> next = node;
	
	return TRUE;
}
    
    
        //插入数据:根据位置插入数据
        BOOL Insert_Pos(List* ls, in

t pos, Data data)
    {
    	if(NULL == ls || pos<1)
    		return ERROR;
    
    		Node *tmp = ls->head;
    		int i;
    		
    		for(i=0;i < pos-1;i++)
	{
		tmp =tmp -> next;	
		if(tmp == NULL)  //越界
		{
			printf("长度越界:%d\n",pos);
			return ERROR;
		}
	}
	
Node *node=(Node*)malloc(sizeof(Node)/sizeof(char));

if(NULL == node)
	return ERROR;

node->data = data;
node->next = tmp->next;
tmp->next  = node;

	return TRUE;	
}


//删除特定位置的数据
BOOL Delete_Pos(List* ls, int pos)
{
	if(NULL == ls || pos<1)
		return ERROR;

	Node *tmp = ls->head;
	int i;
		
for(i=0;i < pos-1;i++)
{
	tmp =tmp -> next;	
	if(tmp == NULL ||tmp -> next == NULL)  //越界
	{
		printf("长度越界:%d\n",pos);
		return ERROR;
	}
}
	


Node *p = tmp->next;//保存特定位置
	tmp->next  = p->next;
	free(p);

	return TRUE;	
}

//根据值删除数据
BOOL Delete_Data(List* ls,  Data data)
{
	if (NULL == ls)
		return;
		
	Node *tmp=ls->head;	
	while(tmp ->next)
	{
		if(tmp ->next ->data == data)
		{
			Node *p = tmp->next;
			tmp->next = p->next;
			free(p);
			return TRUE;
		}
		tmp =tmp ->next;
	}
	
	return FALSE;	
}

    //链表逆序
BOOL Reverse(List* ls)
{
	//NULL == ls 链表不存在
	//NULL == ls -> head ->next 空链表
	//NULL == ls -> head ->next->next 只有一个结点的链表
	


  	if (NULL == ls || NULL == ls->head

|| NULL == ls->head->next ||NULL == ls->head->next->next)
		return ERROR;
		
		Node *pre=ls->head->next;	//第一个结点
		Node *cur=pre->next;	   //第二个结点
	Node *tmp;	              //保存当前结点的下一个结点


while(cur)
{
	tmp = cur ->next;//指向变成反方向
	cur -> next =pre;
	
	pre = cur;
	cur = tmp;
}

	ls->head ->next->next =NULL;
	ls->head ->next = pre;
	
	return TRUE;
}


//打印
void Display(List* ls)
{
	if (NULL == ls)
		return;
	
Node *tmp=ls->head->next;//第一个节点

while(tmp )
{
	printf("%-4d",tmp->data);
	tmp = tmp ->next;
}
	printf ("\n");
}

//销毁
void Destroy(List* ls)
{
	if (NULL == ls)
		return;
		
	Node *tmp =ls->head;
	while(tmp ->next)
{
	Node *p = tmp ->next;
	tmp->next  = p->next;
	free(p);//依次释放内存空间
}

	free(ls->head);
	free(ls);
}

//链表代码总结

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

//数据:
struct Data
{
	int id;
	//char name[15];
	char *name;	//此时需要注意什么?
};

//结点:
struct Node
{
	struct Data data;
	struct Node *next;
};

//头结点的创建及初始化
struct Node* CreateHead(struct Node **head)
{
	//入口参数检查
	if (*head == NULL)
		return;
	//申请空间
	*head = (struct Node *)malloc(sizeof(struct Node)/sizeof(char));
	(*head)->data.name = (char *)malloc(sizeof(char)*15);
	//申请内存的初始化
	(*head)->data.id = 0;
	(*head)->data.name = NULL; 
	(*head)->next = NULL;
	//返回内存的地址
	return *head;
} 

//链表的尾插
int Insert_tail(struct Node *head, struct Data data)
{
	//入口参数检查
	if (NULL == head)
		return 0;
	//申请新结点的内存
	struct Node *node = (struct Node *)malloc(sizeof(struct Node)/sizeof(char));
	//为内存赋值初始化
	node->data.name = (char *)malloc(sizeof(char)*15);
	
	node->data.id = data.id;
	strcpy(node->data.name,data.name);
	node->next = NULL;
	//遍历链表-将指针定位到链表尾部
	while (head->next)
	{
		head = head->next;
	}
	//改变结点指向,使其插入到链表尾部
	head->next = node;
	//成功返回1
	return 1;
}

//删除结点
int Delete(struct Node *head, struct Data data)
{
	//入口参数检查
	if (head == NULL)
		return 0;
	//遍历-定位到要删除的结点
	//while(){ if()}
	//struct Node *tmp = head->next;
	while (head->next)
	{
		if (head->next->data.id == data.id)
		{
			struct Node *p = head->next;
			head->next = p->next;
			free(p);
			return 1;
		}
		head = head->next;
	}
	
	
	//保存要删除结点的地址!!!
	
	//改变结点指向,是要删除的结点脱离链表
	
	//释放被删除结点的内存!!!
	
	//指向该删除结点的指针置空
	
	//成功返回1 失败返回-1
}


void PrintData(struct Data data)
{
	printf("%d,%s\n",data.id,data.name);
}

//链表的遍历打印
void Display(struct Node *head)
{
	//入口参数检查
	if (head == NULL)
		return;
	//遍历链表、打印结点
	//遍历:while(...)		for(i = 0; i < Length(head); ++i)
	//打印结点:print()各个参数    PrintData(data)	自己封装一个打印结构体的函数
	//struct Node *tmp = head->next;
	// while (tmp != NULL)
	// {
	// 		PrintData(tmp->data);
	// 		tmp = tmp->next;
	// }
	
	while (head->next)
	{
		PrintData(head->next->data);
		head = head->next;
	}

}

//链表的长度
int Length(Node *head)
{
	int i;
	while(head->next!=NULL)
	{
		i++;
		head=head->next;
	}
	return i;
}   

int main()
{
	struct Node *head;
	CreateHead(&head);
	
	
	struct Data data1;
	data1.name = (char *)malloc(sizeof(char)*15);
	data1.id = 1;
	strcpy(data1.name, "aa");
	
	
	struct Data data2 = {2,"bb"};
	struct Data data3 = {3,"cc"};
	struct Data data4 = {4,"dd"};
	struct Data data5 = {5,"ee"};
	
	Insert_tail(head,data1);
	
	Insert_tail(head,data2);
	Insert_tail(head,data3);
	Insert_tail(head,data4);
	Insert_tail(head,data5);
	
	Display(head);
	Delete(head,data1);
	Display(head);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值