C语言单链表
单向链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}st,*pt;
pt node_init(void); //初始化节点
void add_head(pt head,int data); //头插
void add_tail(pt head,int data); //尾插
void del_node(pt head,int data); //删除
void show(pt head); //查看
int main(int argc, char const *argv[])
{
int num;
pt head = node_init();
while(1)
{
printf("请输入:");
scanf("%d",&num);while(getchar() != '\n');
printf("──────────────────────────────\n");
if(num > 0)
{
add_tail(head,num); //输入正数则添加
}
else if(num < 0)
{
del_node(head,-num); //输入负数则删除
}
else
return 0;
printf("──────────────────────────────\n");
show(head);
printf("──────────────────────────────\n");
}
return 0;
}
//初始化一个新节点
pt node_init(void)
{
pt head = (pt)malloc(sizeof(st));
if(head == NULL)
{
perror("init failed");
return NULL;
}
head->next = NULL;
return head;
}
//头插
void add_head(pt head,int data)
{
pt new_node = node_init();
if(new_node == NULL)
{
perror("new_node failed");
return;
}
new_node->data = data;
new_node->next = head->next; //偷偷指向头节点下一个
head->next = new_node; //顺序不能换,否则链表断开
printf("加入成功\n");
}
//尾插
void add_tail(pt head,int data)
{
pt new_node = node_init();
if(new_node == NULL) //判断分配空间是否成功
{
perror("new_node failed");
return;
}
new_node->data = data; //数据给新节点
new_node->next = NULL; //指向空
pt pos = head;
while(pos->next != NULL) //遍历到末尾
{
pos = pos->next;
}
pos->next = new_node; //原末尾指针指向新节点
printf("加入成功\n");
}
//删除
void del_node(pt head,int data)
{
if(head->next == NULL)
{
printf("空链表\n");
return;
}
int flag = 0;
pt pos = head->next;
pt pre = head;
while(pos != NULL) //循环遍历查找
{
if(data == pos->data)
{
flag++; //每找到一个,加一
pre->next = pos->next;
pos->next = NULL;
free(pos); //释放空间(只是释放空间,不是删除变量)
pos = pre; //重新指向一个位置
}
pre = pos;
pos = pos->next;
}
if(flag)
{
printf("已删除%d个\n", flag);
return ;
}
else
{
printf("删除失败,无此数据\n");
return ;
}
}
//显示
void show(pt head)
{
pt pos = head->next;
while(pos != NULL)
{
printf("%d\n", pos->data);
pos = pos->next;
}
}
1716

被折叠的 条评论
为什么被折叠?



