#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;
}