链表
warning:
这篇文章距离上次修改已过510天,其中的内容可能已经有所变动。
#include<stdio.h>
#include<stdlib.h>
struct LkList{
int data;//链表数据域
struct LkList *next;//链表指针域
};//结构体自引用
struct LkList* createlist(){
struct LkList* headnode=(struct LkList*)malloc(sizeof(struct LkList));//定义头节点
headnode->next=NULL;//初始化头节点
return headnode;
}//创建链表
struct LkList* createnode(int data){
struct LkList* newnode=(struct LkList*)malloc(sizeof(struct LkList));
newnode->data=data;
newnode->next=NULL;
return newnode;
}//创建节点
void printlist(struct LkList* headnode){
struct LkList* pmove=headnode->next;
while(pmove){
printf("%d ",pmove->data);
pmove=pmove->next;
}
printf("\n");
}//依次遍历并打印链表
void insertnode1(struct LkList* headnode){
int data;
printf("请输入需插入节点值:");
scanf("%d",&data);
struct LkList* newnode=createnode(data);//创建插入节点
newnode->next=headnode->next;//将头节点原指向的下一个节点的地址赋给插入的节点指向的下一个节点地址
headnode->next=newnode;//将头节点原指向下一个节点的地址改为插入的节点
}//头插法插入节点
void insertnode2(struct LkList* headnode){
int data;
printf("请输入需插入节点值:");
scanf("%d",&data);
struct LkList* newnode=createnode(data);//创建插入节点
while(headnode->next!=NULL)//遍历链表到最后一个节点
headnode=headnode->next;
headnode->next=newnode;//将节点点指向的下一个节点变为插入的节点
newnode->next=NULL;//将插入后的新尾节点指针指向NULL
}//尾插法插入节点
void insertnode3(struct LkList* headnode){
int data,index;
printf("请输入需插入节点值和插入位置:");
scanf("%d %d",&data,&index);
for(int i=0;i<index;i++)
headnode=headnode->next;
struct LkList* newnode=createnode(data);//创建插入节点
newnode->next=headnode->next;//将头节点原指向的下一个节点的地址赋给插入的节点指向的下一个节点地址
headnode->next=newnode;//将头节点原指向下一个节点的地址改为插入的节点
}//任意位置插入节点
void delectnode(struct LkList* headnode){
int data;
printf("请输入需删除节点值:");
scanf("%d",&data);
struct LkList* delectnode=headnode->next;//头插法删除节点为头结点指向的下一个节点
struct LkList* frontnode=headnode;//头插法被删除节点的前驱节点为头结点
if(delectnode==NULL)
printf("链表为空");
else{
while(delectnode->data!=data){//遍历查找需要删除的节点
frontnode=delectnode;
delectnode=frontnode->next;
if(delectnode==NULL){
printf("链表遍历完成,未查询到该需删除节点");
return;//直接结束该函数并返回
}
}
frontnode->next=delectnode->next;
free(delectnode);
}
}//删除节点
void searchlen(struct LkList* headnode){
int len=0;
while(headnode->next!=NULL){
headnode=headnode->next;
len++;
}
printf("链表长度:%d\n",len);
}//返回链表长度
void searchnode(struct LkList* headnode){
int data;
printf("请输入需查询节点值:");
scanf("%d",&data);
while(headnode->next!=NULL){
headnode=headnode->next;
if(headnode->data==data){
printf("成功查询到该节点\n");
return;
}
}
printf("未查询到该节点\n");
}//查询链表结点
void lklistmenu(){
printf("1.输出链表\n");
printf("2.头插法插入节点\n");
printf("3.尾插法插入节点\n");
printf("4.任意位置插入节点\n");
printf("5.根据值删除节点\n");
printf("6.返回链表长度\n");
printf("7.根据值查询节点\n");
printf("0.退出程序\n");
}//链表功能菜单
void endsystem() {
exit(0);
}//结束程序
int main(){
int sort;
bool flag=true;
struct LkList* L=createlist();
while(flag){
lklistmenu();
printf("请输入数字选择功能:");
scanf("%d",&sort);
switch(sort){
case 1:{
printlist(L);
break;
}
case 2:{
insertnode1(L);
break;
}
case 3:{
insertnode2(L);
break;
}
case 4:{
insertnode3(L);
break;
}
case 5:{
delectnode(L);
break;
}
case 6:{
searchlen(L);
break;
}
case 7:{
searchnode(L);
break;
}
case 0:{
endsystem();
break;
}
}
printf("\n");
}
}
评论已关闭