C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
来源:互联网 发布:linux 解压zip 重命名 编辑:程序博客网 时间:2024/06/06 03:10
#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);
}
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- eclipse+PyDev 解决 安装了包,可是还是提示没有导入相应的包+snownlp
- (单向链表)数据结构的创建和功能函数(C语言)
- 数据结构之单向链表的实现【C++】
- 推荐基本好书,也是在某网站看到的,希望可以帮助大家!- C语言之四书五经(zt)
- 数据结构(C语言)-单向链表
- 最简单的彩票实现代码set应用,希望大家一起探讨
- 我现在有三个网站了希望大家关照
- 含有头结点的单链表,实现部分功能,希望大家能够给予指点
- c语言数据结构之单向循环链表约瑟夫问题
- 自己写的二叉树创建及非递归遍历(自己写的堆栈),希望对大家有帮助(C还是C++?朋友说我的程序风格有点混乱。。。我是新手,见谅~)
- C语言单向链表的实现
- C语言实现的单向链表
- 单向链表的C语言实现
- C语言单向链表的实现
- c语言单向链表的实现
- C语言单向链表的实现
- C语言单向链表的实现
- hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (背包问题)
- java关键字大全集
- ADO.NET中的DataReader与DataSet
- WinCE中的Data/ Prefetch Abort异常定位
- 自己学写爬虫之----CS240EXCEPTION(一)
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- Oracle 11GR2-RAC环境下修改主机名
- YII 中使用Ueditor
- Android中的Audio播放:音量和远程播放控制
- Vim Essential Plugin: NERDTree
- 策略模式
- USACO:Prime Palindromes
- [LeetCode] Combinations
- Spring Blazeds integration