#include "my_head.h"
typedef int ElemType_t;
//设计一个链表节点 结构体数据类型
typedef struct node{
ElemType_t data;//数据域
struct node *next;//指针域
}Node_t;
//创建一条只有头节点的链表并且初始化
Node_t *creat_head_list()
{
//新建链表头节点--申请一个结构体Node_t的空间
Node_t *head = malloc(sizeof(Node_t));
if(head == NULL)
{
printf("malloc error!\n");
return NULL;
}
//初始化
head->next = NULL;//头节点没有数据域,只有指针域
return head;
}
/*
函数作用;新建一个结点并且初始化
返回值:
成功返回 新建结点的地址
失败返回 NULL
*/
//尾插数据
void insert_list_tail(Node_t *head,ElemType_t inputData)
{
//新建一个节点并初始化
Node_t *newNode = malloc(sizeof(Node_t));
if( newNode == NULL)
{
printf("malloc newNode error!\n");
}
newNode->data = inputData;
newNode->next = NULL;
//遍历链表,找到最后一个节点
Node_t *p = NULL;
for(p=head;p->next!=NULL;p=p->next);
//将新节点插入链表尾部
p->next = newNode;
return;
}
//打印链表
void print_allNodeTolist(Node_t *head)
{
//遍历链表
Node_t *p = NULL;
for(p=head->next;p!=NULL;p=p->next)
{
printf("%d\t",p->data);
}
printf("\n");
}
//新增一个数据,有序插入
Node_t *insert_nodeToList_sort(Node_t *head,ElemType_t addData)
{
//新建一个节点,初始化
Node_t *newNode = malloc(sizeof(Node_t));
if(newNode == NULL)
{
printf("malloc error!\n");
return head;
}
newNode->data = addData;
//遍历链表,找到表中第一个比新节点数据大的节点和他前面那个节点
Node_t *p = NULL;
Node_t *q = NULL;
for(p=head->next;p!=NULL;q=p,p=p->next)
{
if(p->data > addData)
break;
}
if(p == NULL)
{
q->next = newNode;
}
else
{
//第一个数据更改
if( p == head->next)
{
newNode->next = head->next;
head->next = newNode;
}
else//其他位置数据修改
{
q->next = newNode;
newNode->next = p;
}
}
return head;
}
//查询某个数据是否存在链表中
int find_node(Node_t *head, ElemType_t findData)
{
Node_t *p = NULL;
for(p=head->next;p!=NULL;p=p->next)
{
if(p->data == findData)
{
printf("find success is %d!\n",findData);
return 1;
}
}
return -1;
}
//修改链表某个数据
Node_t *gedit_listData(Node_t *head,ElemType_t originData,ElemType_t newData)
{
//看看链表中是否存在这个数据
Node_t *p = NULL;
if(find_node(p=head->next,newData))
{
printf("List have originData can gedit!\n");
}
else
{
printf("No newData!\n");
printf("gedit error!\n");
}
//找到修改的数据,进行修改
for(p=head->next;p!=NULL;p=p->next)
{
if(p->data == originData)
{
p->data = newData;
}
}
return head;
}
//删除链表中的某一个数据
Node_t *delete_listData(Node_t *head,ElemType_t delData)
{
//遍历链表找到你要删除的数据节点,记录当前删除节点和他上一个节点地址
Node_t *p = NULL;
Node_t *q = NULL;//记录删除节点的上一节点
for(p=head->next;p!=NULL;q=p,p=p->next)
{
if(delData == p->data)
break;
}
//如果找不到这个删除数据节点
if(p == NULL)
{
printf("这个数据不存在!\n");
return NULL;
}
//如果这个删除节点是第一个数据节点
if( p == head->next )
{
head = p->next;
free(p);
}
//如果是其他位置的删除节点
else
{
q->next = p->next;
free(p);
}
return head;
}
//头插
Node_t *insert_list_head(Node_t *head,ElemType_t headaddData)
{
Node_t *newNode = malloc(sizeof(Node_t));
if( newNode == NULL)
{
printf("malloc newNode error!\n");
return NULL;
}
newNode->data = headaddData;
newNode->next = head->next;
head->next = newNode;
return head;
}
//指定插入新数据在某个数据位置之前
Node_t *insert_nodeTolist(Node_t *head,ElemType_t listData,ElemType_t updateData)
{
//1.新建一个新节点(申请一个结构体空间)
Node_t *newNode = malloc(sizeof(Node_t));
if(newNode == NULL)
{
printf("malloc newNode error!\n");
return NULL;
}
newNode->data = updateData;
newNode->next = NULL;
//遍历链表,找到指定数据节点和他前一个数据节点
Node_t *p = NULL;
Node_t *q = NULL;//存放指定节点的前一个节点
for(p=head->next;p!=NULL;q=p,p=p->next)
{
if(p->data == listData)
break;
}
//找不到这个指定数据的节点
if(p == NULL)
{
q->next = newNode;//在后面补上这个新的数据节点
}
//找到这个数据节点
else
{
if(p == head->next)
{
newNode->next = head->next;
head->next = newNode;
}
else
{
q->next = newNode;
newNode->next = p;
}
}
return head;
}
//销毁链表
void destroy_allNodeTolist(Node_t *head)
{
Node_t *p = NULL;
Node_t *q = NULL;
for(p=q=head;p!=NULL;p=q)
{
q = p->next;
free(p);
}
}
int main(int argc,char *argv[])
{
//创建一条链表
Node_t *head = NULL;
//定义初始化头节点
head = creat_head_list();
//尾插数据
insert_list_tail(head,10);
insert_list_tail(head,20);
insert_list_tail(head,40);
insert_list_tail(head,60);
insert_list_tail(head,80);
//打印链表
print_allNodeTolist(head);
//新增一个数据,有序插入
head = insert_nodeToList_sort(head,50);
//打印链表
print_allNodeTolist(head);
//查询某个数据是否存在链表中
int ret = find_node(head,60);
if(ret == 1)
printf("该数据存在此链表中!\n");
else
printf("该数据不在此链表中!\n");
//打印链表
print_allNodeTolist(head);
//修改链表某个数据
head = gedit_listData(head,40,44);
//打印链表
print_allNodeTolist(head);
//删除链表中的某一个数据
head = delete_listData(head,20);
//打印链表
print_allNodeTolist(head);
//头插
head = insert_list_head(head,5);
//打印链表
print_allNodeTolist(head);
//指定插入某个数据位置之前
head = insert_nodeTolist(head,80,70);
//打印链表
print_allNodeTolist(head);
//销毁链表
destroy_allNodeTolist(head);
//打印链表
print_allNodeTolist(head);
return 0;
}
单向链表的增删改查(包含头节点--头节点没有数据域)
于 2022-09-09 08:51:47 首次发布