#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node* next;
};
//创造链表节点,返回链表节点所在指针,传入数据域和指针域
struct node* creatnode(int data,struct node* next)
{
struct node* p=malloc(sizeof(struct node));
p->data=data;
p->next=next;
return p;
}
//给定一个链表头节点,判断链表是否为空链表
int isempty(struct node* head)
{
return head->next==NULL;
}
//给定一个链表节点,判断该节点是否为尾节点
int islast(struct node* p)
{
return p->next==NULL;
}
//给定一个链表头节点和一个数据,返回该数据在链表中第一次出现的位置指针,如果链表中不存在该数据,返回NULL
struct node* findnode(struct node* head,int targetdata)
{
struct node* move=head;
while(!isempty(head)&&!islast(move))
{
if(move->next->data==targetdata) return move->next;
move=move->next;
}
return NULL;
}
//给定一个单链表节点以及其前后节点指针,删除该链表节点
void deletenode(struct node* front,struct node* position,struct node* after)
{
front->next=after;
free(position);
}
//给定一个单链表节点,传入链表头节点指针,目标数据X,删除方式deletemethod
//删除链表中值为X的节点
//最后一个参数为0,为隐式删除,只删除第一个值为X的节点
//为1为显式删除,删除所有值为X的节点
void deletenodeX(struct node* head,int X,int deletemethod)
{
struct node* move=head;
if(deletemethod)
{
while(!isempty(head)&&!islast(move))
{
if(move->next->data==X)
{
deletenode(move,move->next,move->next->next);
}
else move=move->next;
}
}
else
{
while(!isempty(head)&&!islast(move))
{
if(move->next->data==X)
{
deletenode(move,move->next,move->next->next);
return;
}
}
}
}
//给定一个链表节点指针和一个数值X,在这个指针后面插入一个值为X的节点
void insertnode(struct node* position,int X)
{
struct node* temp=malloc(sizeof(struct node));
temp->data=X;
temp->next=position->next;
position->next=temp;
}
//给定一个链表头节点,遍历打印链表全部元素
void printnode(struct node* head)
{
struct node* t=head;
while(!islast(t))
{
printf("%d\t",t->next->data);
t=t->next;
}
}
int main(int argc, char *argv[])
{
int temp;
struct node* head=creatnode(0,NULL);
struct node* move=head;
while(scanf("%d",&temp)!=EOF)
{
insertnode(move,temp);
move=move->next;
}
printnode(head);
return 0;
}
关于链表一些方式的C语言实现
最新推荐文章于 2024-05-28 16:27:35 发布