#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//链表代码总结
//数据:
struct Data
{
int id;
char name[15];
//char *name; //此时需要注意什么?
};
//结点:
typedef struct Node
{
struct Data data;
struct Node *next;
}Node;
PrintData(Node* node)
{
printf("%d\t",node->data.id);
printf("%s\n",node->data.name);
}
//头结点的创建及初始化
void CreateHead(struct Node **head)
{
//入口参数检查
if (head == NULL)
{
return;
}
//申请空间
*head = (Node*)malloc(sizeof(Node));
//申请内存的初始化
(*head)->data.id = 0;
(*head)->data.name[0] = '\0';
(*head)->next == NULL;
}
//链表的尾插
int Insert_tail(struct Node *head, struct Data data)
{
//入口参数检查
//申请新结点的内存
Node* node = (Node*)malloc(sizeof(Node));
//为内存赋值初始化
node->data.id = data.id;
strcpy(node->data.name, data.name);
//遍历链表-将指针定位到链表尾部
Node* temp = head;
while(temp->next)
{
temp = temp->next;
}
//改变结点指向,使其插入到链表尾部
temp->next = node;
node->next = NULL;
//成功返回1
return 1;
}
//删除结点
int Delete(struct Node *head, struct Data data)
{
//入口参数检查
//遍历-定位到要删除的结点
//while(){ if()}
Node* temp = head;
while((temp->next->data.id != data.id) || (strcmp(temp->next->data.name,data.name) != 0))
{
temp = temp->next;
}
//保存要删除结点的地址!!!
Node* tmp = temp->next;
//改变结点指向,是要删除的结点脱离链表
temp->next = tmp->next;
//释放被删除结点的内存!!!
free(tmp);
//指向该删除结点的指针置空
tmp = NULL;
//成功返回1 失败返回-1
return 1;
}
//修改结点信息
int Updata(struct Node *head, struct Data data)
{
//入口参数检查
//遍历-找到要修改的结点,根据节点的id修改
Node *temp = head->next;
while(temp->data.id != data.id)
{
temp = temp->next;
}
//进行赋值修改操作
temp->data.id = data.id;
strcpy(temp->data.name, data.name);
//修改成功 返回1 失败或找不到 返回 -1
return 1;
}
//链表的遍历打印
void Display(struct Node *head)
{
//入口参数检查
//遍历链表、打印结点
Node *temp = head->next;
while(temp)
{
PrintData(temp);
temp = temp->next;
}
printf("\n");
//遍历:while(...) for(i = 0; i < Length(head); ++i)
//打印结点:print()各个参数 PrintData(data) 自己封装一个打印结构体的函数
}
//链表的长度
int Length(struct Node *head)
{
//入口参数检查
//定义count变量,遍历链表进行计数
int count = 0;
while(head->next)
{
count++;
head = head->next;
}
return count;
//返回count,若链表为空,返回0
}
int main()
{
Node* head = NULL;
CreateHead(&head);
Insert_tail(head, (struct Data){1,"zj"});
Insert_tail(head, (struct Data){2,"fl"});
Insert_tail(head, (struct Data){3,"lj"});
Insert_tail(head, (struct Data){4,"lzw"});
Display(head);
Delete(head, (struct Data){1,"zj"});
Display(head);
Updata(head, (struct Data){3,"ly"});
Display(head);
}