解释都在代码里;
该代码含头插法和尾插法两种方法实现插入结点;
该代码以菜单的方式呈现功能选择;
详细见代码:
#include<stdio.h>
#include<stdlib.h> //malloc需要用到该头文件
//1.首先创建一个链表结构------->数据域+指针
typedef struct NODE
{
int data;
struct NODE* next;
}LNODE; //typedef将struct NODE改名为LNODE(结构体类型标识符)
//2.创建一个表头
LNODE* creatlist()
{
LNODE* head=(LNODE*)malloc(sizeof(LNODE)); //头节点一般不给数据(也可以拓展让其存储链表长度)
head->next=NULL;
return head;
} ;
//3.创建一个结点--------->为4.为插入结点作定义
LNODE* creatNODE(int data)
{
LNODE* PNODE=(LNODE*)malloc(sizeof(LNODE));
PNODE->data=data;
PNODE->next=NULL;
return PNODE;
};
//4.插入一个结点------------>头插法(head->......、4、3、2、1)
void insert(LNODE* head,int data)
{
LNODE* newNODE=creatNODE(data);
newNODE->next=head->next; //总是从head->next插入
head->next=newNODE;
}
/**///尾插法------(head->1、2、3、4、......)
void wcinsert(LNODE* head,int data)
{
LNODE* newNODE=creatNODE(data);
LNODE* pmove=head;
while(pmove->next!=NULL) //总是先遍历完当前链表,使指针指向表尾
{
pmove=pmove->next;
}
pmove->next=newNODE; //存入表尾
}
//5.删除一个结点
void del(LNODE* head,int data)
{
if(head->next==NULL) //先判断链表是否为空很有必要
{
printf("该链表为空!\n");
return;
}
LNODE* P=(LNODE*)malloc(sizeof(LNODE)); //定义一个当前结点指针和上一个结点的指针记录
LNODE* PF=(LNODE*)malloc(sizeof(LNODE));
P=head->next;
PF=head;
while(P) //判断是否循环完链表
{
if(P->data==data) //循环直到找到该数据
{
PF->next=P->next;
free(P); //------>一定要free释放内存空间,防止地址溢出
return ;
}
PF=P;
P=P->next;
}
printf("未找到该数据!");
}
//6.遍历输出
void print(LNODE* head)
{
if(head->next==NULL)
{
printf("该链表为空!\n");
return;
}
LNODE* Pmove=(LNODE*)malloc(sizeof(LNODE)); //用一个指针来循环整个链表
Pmove=head->next;
printf("链表数据如下:\n");
while(Pmove)
{
printf("%4d\t",Pmove->data);
Pmove=Pmove->next;
}
printf("\n");
}
//**7.连续插入结点
int progress(LNODE* head)
{
int i,n=0,k=0;
printf("请输入要插入几个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入要插入的第%d个数的值:",i+1);
scanf("%d",&k);
//insert(head,k); //头插法
wcinsert(head,k); //尾插法
}
printf("插入完成!");
}
//**8.连续删除结点
void dell(LNODE* head)
{
int i,n=0,k=0;
printf("请输入要删除几个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入要删除的第%d个数的值:",i+1);
scanf("%d",&k);
del(head,k);
}
printf("删除完成!");
}
void firstface()
{
printf("/**********************菜单***************************/\n");
printf(" 1.显示菜单\n");
printf(" 2.插入数据\n");
printf(" 3.删除数据\n");
printf(" 4.显示链表中的全部数据\n");
printf(" 5.退出!\n");
}
//***************************主程序*********************************//
void main()
{
int i=0,j=1;
LNODE* head=(LNODE*)malloc(sizeof(LNODE));
head=creatlist();
firstface();
while(j)
{
printf("请输入操作:");
scanf("%d",&i);
switch(i)
{
case 1:
firstface();break;
case 2:
progress(head);break;
case 3:
dell(head);break;
case 4:
print(head); break;
case 5:
j=0;
}
}
}