#include <stdio.h>
#include <stdlib.h>
typedef struct NodeStruct
{
int num;
struct NodeStruct *next;
}Node;
int Nodenum=0;
int IsEmpty(Node **headp)
{
if(*headp==NULL||headp==NULL)
{
return 1 ;
}
else
{
return 0;
}
}
int Nodenums()
{
return Nodenum;
}
Node **CreateList(void)
{
Node *head=NULL;
Node *newpoint=NULL,*previewpoint=NULL;
newpoint=(Node *)malloc(sizeof(Node));//开辟第一个节点
printf("Please Input The num when -1 to exit:\n");
scanf("%d",&newpoint->num);
while(-1 != newpoint->num)
{
Nodenum++;
if(1==Nodenum)
{
head=newpoint;
}
else
{
previewpoint->next=newpoint;
}
previewpoint=newpoint;//使得previewpoint指向当前链表的最后一个节点
newpoint=(Node *)malloc(sizeof(Node));//newpoint指针又去开辟新的节点
scanf("%d",&newpoint->num); //输入数据
//节点数加1
}
free(newpoint); //这个是num=-1的情况下的节点因为不符合条件所以要将它释放
if(Nodenum!=0) //如果节点不止一个的话就在最末尾添加NULL
{
previewpoint->next=NULL;
}
return &head; //将链表头地址给一个指向指针的指针这样可以在以后更改头指针的值。
}
void display(const Node **headp)
{
Node *point=*headp;
if(IsEmpty(headp))
{
printf("No node to be display!\n"); //头指针值为0或者第一个指针值为0表示空链表
return ;
}else
{
printf("There are %d Nodes in The list\n",Nodenum);
while(point!=NULL) //注意这里不是point->next否则最后一个无法显示
{
printf("%d\n",point->num);
point=point->next; //指针下移
}
}
}
void deleteList(Node **headp)
{
Node *Point=NULL;
Node *TobeDele=NULL;
if(IsEmpty(headp))
{
printf("List empty,No Node to be delete!\n");
return;
}
Point=TobeDele=*(headp); //指向第一个元素
while(Point!=NULL)
{
Point=Point->next;
*(headp)=Point;
//printf("%d To be delete!\n",TobeDele->num);
free(TobeDele);
TobeDele=Point;
Nodenum--;
}
*headp=NULL;
headp=NULL;
}
Node *SearchNode(Node **headp,int TobeSeach)
{
Node *point;
int index=0;
if(IsEmpty(headp))
{
return NULL;
}
else
{
point=*headp;
index++;
while((point!=NULL)&&(TobeSeach!=point->num))
{
index++;
point=point->next;
}
//还有疑问就是如果下面的if语句删掉就进入死循环这是为什么?(未解决)
if(point!=NULL)
{
printf("The node index you want to search is %d:\n",index);
}
return point;//如果没找到就放回point=NULL,否则找到的point
}
}
int DeleNode(Node **headp,int num)
{
Node *point;
Node *preview;
if(IsEmpty(headp))
{
return 0;
}
else
{
point=*(headp);
preview=point;
while(point!=NULL)
{
while((point->next!=NULL)&&(point->num!=num))
{
preview=point;
point=point->next;
}
if(point->num==num)
{
if(point->next!=NULL)
{
if(point==*(headp))
{
*headp=point->next;
free(point);
point=*(headp);
preview=point;
}
else
{
preview->next=point->next;
free(point);
point=preview->next;
}
}else
{
if(point==*(headp))
{
*(headp)=NULL;
}else
{
preview->next=NULL;
}
free(point);
Nodenum--;
break;
}
Nodenum--;
}
else if(point->next==NULL)
{
break;
}
}
return 1;
}
}
int InsertNode(Node **headp,int Nodeindex,int num)
{
Node *point=NULL;
Node *preview=NULL;
int CurrentNodeNum;
//int CurrentNodeNum=0; 上一句如果改为这句,也就是在这里初始化为0,为什么会导致判断headp为空链表(这个问题还没解决)
if(IsEmpty(headp))
{
if(Nodeindex==0)
{
Node *mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
mallocpoint->num=num;
*headp=mallocpoint;
mallocpoint->next=NULL;
Nodenum++;
}
else
{
return 0;
}
}
else
{
int CurrentNodeNum=0;
point=*headp;
CurrentNodeNum++;
Node * mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
mallocpoint->num=num;
while((point->next!=NULL)&&(CurrentNodeNum!=Nodeindex))
{
preview=point;
point=point->next;
CurrentNodeNum++;
}
if(point->next==NULL)
{
point->next=mallocpoint;
mallocpoint->next=NULL;
}
else
{
if(point==*headp)
{
mallocpoint->next=point;
*headp=mallocpoint;
}
else
{
mallocpoint->next=point;
preview->next=mallocpoint;
}
}
Nodenum++;
return 1;
}
}
int main()
{
Node **headp=NULL;
Node *point=NULL;
headp=CreateList();
display(headp);
InsertNode(headp,4,45);
display(headp);
point=SearchNode(headp,23);
if(point!=NULL)
{
printf("%d\n",point->num);
}
else
{
printf("search failed!\n");
}
DeleNode(headp,45);
display(headp);
deleteList(headp);
display(headp);
}
#include <stdlib.h>
typedef struct NodeStruct
{
int num;
struct NodeStruct *next;
}Node;
int Nodenum=0;
int IsEmpty(Node **headp)
{
if(*headp==NULL||headp==NULL)
{
return 1 ;
}
else
{
return 0;
}
}
int Nodenums()
{
return Nodenum;
}
Node **CreateList(void)
{
Node *head=NULL;
Node *newpoint=NULL,*previewpoint=NULL;
newpoint=(Node *)malloc(sizeof(Node));//开辟第一个节点
printf("Please Input The num when -1 to exit:\n");
scanf("%d",&newpoint->num);
while(-1 != newpoint->num)
{
Nodenum++;
if(1==Nodenum)
{
head=newpoint;
}
else
{
previewpoint->next=newpoint;
}
previewpoint=newpoint;//使得previewpoint指向当前链表的最后一个节点
newpoint=(Node *)malloc(sizeof(Node));//newpoint指针又去开辟新的节点
scanf("%d",&newpoint->num); //输入数据
//节点数加1
}
free(newpoint); //这个是num=-1的情况下的节点因为不符合条件所以要将它释放
if(Nodenum!=0) //如果节点不止一个的话就在最末尾添加NULL
{
previewpoint->next=NULL;
}
return &head; //将链表头地址给一个指向指针的指针这样可以在以后更改头指针的值。
}
void display(const Node **headp)
{
Node *point=*headp;
if(IsEmpty(headp))
{
printf("No node to be display!\n"); //头指针值为0或者第一个指针值为0表示空链表
return ;
}else
{
printf("There are %d Nodes in The list\n",Nodenum);
while(point!=NULL) //注意这里不是point->next否则最后一个无法显示
{
printf("%d\n",point->num);
point=point->next; //指针下移
}
}
}
void deleteList(Node **headp)
{
Node *Point=NULL;
Node *TobeDele=NULL;
if(IsEmpty(headp))
{
printf("List empty,No Node to be delete!\n");
return;
}
Point=TobeDele=*(headp); //指向第一个元素
while(Point!=NULL)
{
Point=Point->next;
*(headp)=Point;
//printf("%d To be delete!\n",TobeDele->num);
free(TobeDele);
TobeDele=Point;
Nodenum--;
}
*headp=NULL;
headp=NULL;
}
Node *SearchNode(Node **headp,int TobeSeach)
{
Node *point;
int index=0;
if(IsEmpty(headp))
{
return NULL;
}
else
{
point=*headp;
index++;
while((point!=NULL)&&(TobeSeach!=point->num))
{
index++;
point=point->next;
}
//还有疑问就是如果下面的if语句删掉就进入死循环这是为什么?(未解决)
if(point!=NULL)
{
printf("The node index you want to search is %d:\n",index);
}
return point;//如果没找到就放回point=NULL,否则找到的point
}
}
int DeleNode(Node **headp,int num)
{
Node *point;
Node *preview;
if(IsEmpty(headp))
{
return 0;
}
else
{
point=*(headp);
preview=point;
while(point!=NULL)
{
while((point->next!=NULL)&&(point->num!=num))
{
preview=point;
point=point->next;
}
if(point->num==num)
{
if(point->next!=NULL)
{
if(point==*(headp))
{
*headp=point->next;
free(point);
point=*(headp);
preview=point;
}
else
{
preview->next=point->next;
free(point);
point=preview->next;
}
}else
{
if(point==*(headp))
{
*(headp)=NULL;
}else
{
preview->next=NULL;
}
free(point);
Nodenum--;
break;
}
Nodenum--;
}
else if(point->next==NULL)
{
break;
}
}
return 1;
}
}
int InsertNode(Node **headp,int Nodeindex,int num)
{
Node *point=NULL;
Node *preview=NULL;
int CurrentNodeNum;
//int CurrentNodeNum=0; 上一句如果改为这句,也就是在这里初始化为0,为什么会导致判断headp为空链表(这个问题还没解决)
if(IsEmpty(headp))
{
if(Nodeindex==0)
{
Node *mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
mallocpoint->num=num;
*headp=mallocpoint;
mallocpoint->next=NULL;
Nodenum++;
}
else
{
return 0;
}
}
else
{
int CurrentNodeNum=0;
point=*headp;
CurrentNodeNum++;
Node * mallocpoint=(Node *)malloc(sizeof(Node));//为什么这个在开头定义会使得headp自动更改
mallocpoint->num=num;
while((point->next!=NULL)&&(CurrentNodeNum!=Nodeindex))
{
preview=point;
point=point->next;
CurrentNodeNum++;
}
if(point->next==NULL)
{
point->next=mallocpoint;
mallocpoint->next=NULL;
}
else
{
if(point==*headp)
{
mallocpoint->next=point;
*headp=mallocpoint;
}
else
{
mallocpoint->next=point;
preview->next=mallocpoint;
}
}
Nodenum++;
return 1;
}
}
int main()
{
Node **headp=NULL;
Node *point=NULL;
headp=CreateList();
display(headp);
InsertNode(headp,4,45);
display(headp);
point=SearchNode(headp,23);
if(point!=NULL)
{
printf("%d\n",point->num);
}
else
{
printf("search failed!\n");
}
DeleNode(headp,45);
display(headp);
deleteList(headp);
display(headp);
}