#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int elemtype;///定义类型,下次修改可以直接在这里修改
typedef struct node
{
elemtype data;///数据域
struct node *next;///指针域
}linklist;
linklist *initLinkList();///初始化链表
void creatLinkList(linklist *);///创建链表
void displayLinkList(linklist *);///输出链表
linklist *search_loc(linklist *,int );///查找链表的节点
void search_val(linklist *,elemtype ,int *);///查找链表的值
int del_loc(linklist *,int );///删除链表的节点
int del_val(linklist *,elemtype );///删除链表的值
int insert_loc(linklist *,int ,elemtype );///插入节点的值
int insert_val(linklist *,elemtype ,elemtype );///出入值的节点
void clear();///清屏
int main()
{
int choice,loc,ok;
elemtype m,n;
linklist *L,*temp;///L是头结点,temp是接下来用来存地址使用的
do{
printf("\t\t\t*************************\n");
printf("\t\t\t*1.初始化链表\t\t*\n");
printf("\t\t\t*2.创建链表 \t\t*\n");
printf("\t\t\t*3.输出链表 \t\t*\n");
printf("\t\t\t*4.查找链表节点\t\t*\n");
printf("\t\t\t*5.查找链表的值\t\t*\n");
printf("\t\t\t*6.删除链表的节点\t*\n");
printf("\t\t\t*7.删除链表的值的节点 *\n");
printf("\t\t\t*8.插入链表的节点的值 *\n");
printf("\t\t\t*9.插入链表的节点的值 *\n");
printf("\t\t\t*0.退出 \t\t*\n");
printf("\t\t\t*************************\n");
printf("请输入你需要的操作数:");
scanf("%d",&choice);
if(choice==0)
break;
switch(choice)
{
case 1: L=initLinkList();break;///初始化链表之后得把地址赋值给L
case 2: creatLinkList(L);break;
case 3: displayLinkList(L);break;
case 4: printf("请输入你需要查找的节点位置:");
scanf("%d",&loc);
temp=search_loc(L,loc);///查找到节点之后返回地址赋值给temp
if(temp==NULL)
printf("NULL\n");
else
printf("%p",temp);///%p是输出计算机的地址
break;
case 5: loc=0;///初始化loc,如果没有查找到节点loc是0
printf("请输入你需要的查找的数值:");
scanf("%d",&n);
search_val(L,n,&loc);///loc传地址,在函数查找到后传回地址
if(loc==0)
printf("NULL");
else
printf("该数值在%d的位置\n",loc);
break;
case 6: printf("请输入你需要删除的节点位置:");
scanf("%d",&loc);
ok=del_loc(L,loc);
if(ok)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 7: printf("请输入你需要删除的值:");
scanf("%d",&n);
ok=del_val(L,n);
if(ok)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 8: printf("请输入你要插入的位置:");
scanf("%d",&loc);
printf("请输入你要插入的值:");
scanf("%d",&n);
ok=insert_loc(L,loc,n);
if(ok)
printf("插入成功\n");
else
printf("插入失败\n");
break;
case 9: printf("请输入你需要插入在某值的前面的值:");
scanf("%d",&m);
printf("请输入你需要插入的值:");
scanf("%d",&n);
ok=insert_val(L,m,n);
if(ok)
printf("插入成功\n");
else
printf("插入失败\n");
break;
default:printf("输入错误,请重新输入\n");break;
}
clear();
}while(1);
return 0;
}
///初始化链表
linklist *initLinkList()
{
linklist *L;
L=(linklist *)malloc(sizeof(linklist));
if(!L)
printf("初始化失败\n");
else
printf("初始化成功\n");
L->next=NULL;
return L;///初始化完返回地址
}
///创建链表
void creatLinkList(linklist *L)
{
linklist *p,*q,*temp;
int num,data;
temp=L;
while(temp->next!=NULL)
{
temp=temp->next;
}
///采取的是尾插法,再次进入的时候的尾插的头节点应该是链表的最后一个节点,继续插入
p=temp;///未插入数据之前,头节点就是上一次链表的头节点
printf("\t\t\t请输入你需要的添加数量:");
scanf("%d",&num);
printf("\t\t\t请输入%d个数据:",num);
while(num--)
{
scanf("%d",&data);
q=(linklist *)malloc(sizeof(linklist));
q->data=data;
q->next=p->next;
p->next=q;
p=q;
}
}
///输出链表
void displayLinkList(linklist *L)
{
linklist *p;
p=L;
printf("\t\t\t以下是链表的数据:");
if(!p->next)///链表如果是空的应该立马输出空的,并返回
{
printf("NULL\n");
return ;
}
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
///查找链表的节点
linklist *search_loc(linklist *L,int loc)
{
int position=0;
linklist *p;
p=L;
if(!p->next)
{
///链表为空的,输出NULL
return NULL;///返回空地址
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(position==loc)///查找到节点并跳出
break;
}
if(position==loc)
return p;
else
return NULL;///查找不到返回空
}
///查找链表的值
void search_val(linklist *L,int n,int *loc)
{
int position=0;
linklist *p;
p=L;
if(!p->next)
{
///链表为空的,输出NULL
return ;///并返回
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(p->data==n)
*loc=position;///loc是指针,只要让loc指向position的地址,返回的时候就可以改变loc的值
}
return ;
}
///删除链表的节点
int del_loc(linklist *L,int loc)
{
int position=0,ok=0;
linklist *p,*q;
p=L;q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///删除失败返回0
}
while(q->next!=NULL)
{
q=q->next;///用q来查找需要删除的值
++position;
if(position==loc)
{
p->next=q->next;///p是要删除的前一个,那只要它的next指向要删除的下一个地址就跳过了要删除的值
free(q);///释放空间
q=p;///释放完q得指向p,那样p的next也就是q的next,让q的链表正常,也就让L的链表连接正常
ok=1;///删除成功
break;
}
p=q;///这样一直循环就是p永远是要删除的前一个地址,删除的时候需要
}
if(ok)
return 1;///删除成功返回1
else
return 0;///删除失败返回0
}
///删除链表的值
int del_val(linklist *L,int n)
{
int ok=0;
linklist *p,*q;
p=L;q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///删除失败返回0
}
while(q->next!=NULL)
{
q=q->next;///该删除值的方法与删除节点的方法一样,就不再重复解释了
if(q->data==n)
{
p->next=q->next;
free(q);
q=p;
ok=1;
break;
}
p=q;
}
if(ok)
return 1;///删除成功返回1
else
return 0;///删除失败返回0
}
///插入节点的值
int insert_loc(linklist *L,int loc,int n)
{
int position=0,flag=0;
linklist *p,*temp;
temp=(linklist *)malloc(sizeof(linklist));
temp->data=n;
p=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///插入失败返回0
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(position==loc-1)///插入的值是loc,我们查找到loc的前一个就够了
{
flag=1;
break;
}
}
temp->next=p->next;///p是loc-1的位置,p->next的位置就是loc了,让temp的next指向loc,那么temp的位置也就变成loc的位置了
p->next=temp;///p->next就是loc指向temp,也就是插入成功了,temp的位置变成loc的位置了
if(flag)
return 1;///插入成功返回1
else
return 0;///插入失败返回0
}
///插入值的节点
int insert_val(linklist *L,int m,int n)
{
int loc=0,position=0,flag=0;
linklist *p,*q,*temp;
temp=(linklist *)malloc(sizeof(linklist));
q=(linklist *)malloc(sizeof(linklist));
temp->data=n;
p=L;
q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///插入失败返回0
}
while(p->next!=NULL)
{
p=p->next;
++loc;
if(p->data==m)
{
flag=1;
break;
}
}
while(q->next!=NULL)
{
q=q->next;
++position;
if(position==loc-1)
break;
}
temp->next=q->next;
q->next=temp;
if(flag)
return 1;
else
return 0;
}
///清屏
void clear()
{
printf("\n请按任意键技继续......");
getch();
system("cls");
}
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int elemtype;///定义类型,下次修改可以直接在这里修改
typedef struct node
{
elemtype data;///数据域
struct node *next;///指针域
}linklist;
linklist *initLinkList();///初始化链表
void creatLinkList(linklist *);///创建链表
void displayLinkList(linklist *);///输出链表
linklist *search_loc(linklist *,int );///查找链表的节点
void search_val(linklist *,elemtype ,int *);///查找链表的值
int del_loc(linklist *,int );///删除链表的节点
int del_val(linklist *,elemtype );///删除链表的值
int insert_loc(linklist *,int ,elemtype );///插入节点的值
int insert_val(linklist *,elemtype ,elemtype );///出入值的节点
void clear();///清屏
int main()
{
int choice,loc,ok;
elemtype m,n;
linklist *L,*temp;///L是头结点,temp是接下来用来存地址使用的
do{
printf("\t\t\t*************************\n");
printf("\t\t\t*1.初始化链表\t\t*\n");
printf("\t\t\t*2.创建链表 \t\t*\n");
printf("\t\t\t*3.输出链表 \t\t*\n");
printf("\t\t\t*4.查找链表节点\t\t*\n");
printf("\t\t\t*5.查找链表的值\t\t*\n");
printf("\t\t\t*6.删除链表的节点\t*\n");
printf("\t\t\t*7.删除链表的值的节点 *\n");
printf("\t\t\t*8.插入链表的节点的值 *\n");
printf("\t\t\t*9.插入链表的节点的值 *\n");
printf("\t\t\t*0.退出 \t\t*\n");
printf("\t\t\t*************************\n");
printf("请输入你需要的操作数:");
scanf("%d",&choice);
if(choice==0)
break;
switch(choice)
{
case 1: L=initLinkList();break;///初始化链表之后得把地址赋值给L
case 2: creatLinkList(L);break;
case 3: displayLinkList(L);break;
case 4: printf("请输入你需要查找的节点位置:");
scanf("%d",&loc);
temp=search_loc(L,loc);///查找到节点之后返回地址赋值给temp
if(temp==NULL)
printf("NULL\n");
else
printf("%p",temp);///%p是输出计算机的地址
break;
case 5: loc=0;///初始化loc,如果没有查找到节点loc是0
printf("请输入你需要的查找的数值:");
scanf("%d",&n);
search_val(L,n,&loc);///loc传地址,在函数查找到后传回地址
if(loc==0)
printf("NULL");
else
printf("该数值在%d的位置\n",loc);
break;
case 6: printf("请输入你需要删除的节点位置:");
scanf("%d",&loc);
ok=del_loc(L,loc);
if(ok)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 7: printf("请输入你需要删除的值:");
scanf("%d",&n);
ok=del_val(L,n);
if(ok)
printf("删除成功\n");
else
printf("删除失败\n");
break;
case 8: printf("请输入你要插入的位置:");
scanf("%d",&loc);
printf("请输入你要插入的值:");
scanf("%d",&n);
ok=insert_loc(L,loc,n);
if(ok)
printf("插入成功\n");
else
printf("插入失败\n");
break;
case 9: printf("请输入你需要插入在某值的前面的值:");
scanf("%d",&m);
printf("请输入你需要插入的值:");
scanf("%d",&n);
ok=insert_val(L,m,n);
if(ok)
printf("插入成功\n");
else
printf("插入失败\n");
break;
default:printf("输入错误,请重新输入\n");break;
}
clear();
}while(1);
return 0;
}
///初始化链表
linklist *initLinkList()
{
linklist *L;
L=(linklist *)malloc(sizeof(linklist));
if(!L)
printf("初始化失败\n");
else
printf("初始化成功\n");
L->next=NULL;
return L;///初始化完返回地址
}
///创建链表
void creatLinkList(linklist *L)
{
linklist *p,*q,*temp;
int num,data;
temp=L;
while(temp->next!=NULL)
{
temp=temp->next;
}
///采取的是尾插法,再次进入的时候的尾插的头节点应该是链表的最后一个节点,继续插入
p=temp;///未插入数据之前,头节点就是上一次链表的头节点
printf("\t\t\t请输入你需要的添加数量:");
scanf("%d",&num);
printf("\t\t\t请输入%d个数据:",num);
while(num--)
{
scanf("%d",&data);
q=(linklist *)malloc(sizeof(linklist));
q->data=data;
q->next=p->next;
p->next=q;
p=q;
}
}
///输出链表
void displayLinkList(linklist *L)
{
linklist *p;
p=L;
printf("\t\t\t以下是链表的数据:");
if(!p->next)///链表如果是空的应该立马输出空的,并返回
{
printf("NULL\n");
return ;
}
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
///查找链表的节点
linklist *search_loc(linklist *L,int loc)
{
int position=0;
linklist *p;
p=L;
if(!p->next)
{
///链表为空的,输出NULL
return NULL;///返回空地址
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(position==loc)///查找到节点并跳出
break;
}
if(position==loc)
return p;
else
return NULL;///查找不到返回空
}
///查找链表的值
void search_val(linklist *L,int n,int *loc)
{
int position=0;
linklist *p;
p=L;
if(!p->next)
{
///链表为空的,输出NULL
return ;///并返回
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(p->data==n)
*loc=position;///loc是指针,只要让loc指向position的地址,返回的时候就可以改变loc的值
}
return ;
}
///删除链表的节点
int del_loc(linklist *L,int loc)
{
int position=0,ok=0;
linklist *p,*q;
p=L;q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///删除失败返回0
}
while(q->next!=NULL)
{
q=q->next;///用q来查找需要删除的值
++position;
if(position==loc)
{
p->next=q->next;///p是要删除的前一个,那只要它的next指向要删除的下一个地址就跳过了要删除的值
free(q);///释放空间
q=p;///释放完q得指向p,那样p的next也就是q的next,让q的链表正常,也就让L的链表连接正常
ok=1;///删除成功
break;
}
p=q;///这样一直循环就是p永远是要删除的前一个地址,删除的时候需要
}
if(ok)
return 1;///删除成功返回1
else
return 0;///删除失败返回0
}
///删除链表的值
int del_val(linklist *L,int n)
{
int ok=0;
linklist *p,*q;
p=L;q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///删除失败返回0
}
while(q->next!=NULL)
{
q=q->next;///该删除值的方法与删除节点的方法一样,就不再重复解释了
if(q->data==n)
{
p->next=q->next;
free(q);
q=p;
ok=1;
break;
}
p=q;
}
if(ok)
return 1;///删除成功返回1
else
return 0;///删除失败返回0
}
///插入节点的值
int insert_loc(linklist *L,int loc,int n)
{
int position=0,flag=0;
linklist *p,*temp;
temp=(linklist *)malloc(sizeof(linklist));
temp->data=n;
p=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///插入失败返回0
}
while(p->next!=NULL)
{
p=p->next;
++position;
if(position==loc-1)///插入的值是loc,我们查找到loc的前一个就够了
{
flag=1;
break;
}
}
temp->next=p->next;///p是loc-1的位置,p->next的位置就是loc了,让temp的next指向loc,那么temp的位置也就变成loc的位置了
p->next=temp;///p->next就是loc指向temp,也就是插入成功了,temp的位置变成loc的位置了
if(flag)
return 1;///插入成功返回1
else
return 0;///插入失败返回0
}
///插入值的节点
int insert_val(linklist *L,int m,int n)
{
int loc=0,position=0,flag=0;
linklist *p,*q,*temp;
temp=(linklist *)malloc(sizeof(linklist));
q=(linklist *)malloc(sizeof(linklist));
temp->data=n;
p=L;
q=L;
if(!p->next)
{
printf("NULL\n");///链表为空的,输出NULL
return 0;///插入失败返回0
}
while(p->next!=NULL)
{
p=p->next;
++loc;
if(p->data==m)
{
flag=1;
break;
}
}
while(q->next!=NULL)
{
q=q->next;
++position;
if(position==loc-1)
break;
}
temp->next=q->next;
q->next=temp;
if(flag)
return 1;
else
return 0;
}
///清屏
void clear()
{
printf("\n请按任意键技继续......");
getch();
system("cls");
}
单向链表
最新推荐文章于 2024-08-04 17:29:18 发布