#include "stdio.h"
#include "stdlib.h" //提供malloc()和free()
#include "string.h" //提供strcpy()等
void show();
void add(int a);
void deleteNode();
void addTitle(int a);
void addRand(int index,int a);
void delectRand(int indexs);
struct NODE
{
int data;
struct NODE *next;
};
typedef struct NODE Node;
Node* find(int a);
Node *head=NULL;//全局头节点
Node *end=NULL;//全局尾节点
void add(int a)
{
//malloc()函数:在内存里开辟(指定大小)空间 ;返回值是一个指针(void *)
Node *temp=(Node*)malloc(sizeof(Node));//此处注意强制类型转换
temp->data=a;//给新节点data赋值
temp->next=NULL;//给新节点的下一个节点的地址为空
if(head==NULL)//判断是否是空链表
{
head=temp; //是空链表;则该节点是头节点;也是尾节点
}else
{
end->next=temp;//不是尾节点;则把该节点的地址赋给尾节点
}
end=temp;//新节点节点作为尾节点
}
//查询链表所有数据
void show()
{
Node *p;
p=head;
do
{
printf("%d\n",p->data);
p=p->next;
}while(p!=NULL);
}
//指定节点查询
Node* find(int a){
Node *p;
p=head;
do
{
if(a==p->data)
{
return p;
}
p=p->next;
}while(p!=NULL);
return NULL;
}
//指定位置插入
void addRand(int index,int a)
{
Node *p=find(index);
if(p==NULL)
{
printf("指定位置没有找到!\n");
return;
}
Node *temp=(Node*)malloc(sizeof(Node));//此处注意强制类型转换
temp->data=a;//给新节点data赋值
temp->next=p->next;//将指定节点的下一个节点地址赋给新节点
p->next=temp;//将新节点的地址赋给指定节点
}
//在头部进行插入
void addTitle(int a)
{
Node *temp=(Node*)malloc(sizeof(Node));//此处注意强制类型转换
temp->data=a;//给新节点data赋值
temp->next=head;//将指定节点的下一个节点地址赋给新节点
head=temp;
}
//指定位置删除
void delectRand(int index)
{
if(index==head->data)//删除的节点是头节点
{
head=head->next;
return;
}else
{
Node *pt=find(index);
Node *p;
p=head;
while(p->next!=pt){
p=p->next;
}
if(pt->next==NULL)//删除为节点
{
end=p;
}
p->next=pt->next;
}
}
//清空链表
void deleteNode()
{
Node *p=head,*pr;
while(p->next!=NULL)
{
pr=p;
p=p->next;
free(pr);
}
head=NULL;
end=NULL;
}
int main()
{
add(1);
add(2);
add(3);
add(4);
add(5);
show();
printf("----------\n");
// delectRand(1,0);
// addTitle(100);
delectRand(5);
add(5);
show();
// deleteNode();
// add(5);
// show();
// printf("----------");
// Node *p=find(4);
// printf("%d",p->data);
}