标签:
/*
本次操作是对带头节点单链表的操作 包括删除 插入 判空 建立
包括删除插入函数 显示函数
目的是为了对单链表做一个基本操作的总结----1
*/
#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define ENDFLAG 0
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;//定义链表结点
//初始化链表
int InitSqList(LinkList *head){
*head=(LinkList)malloc(sizeof(LNode));//定义头结点
if(NULL==*head)
exit(ERROR);//-1 初始化失败
(*head)->next=NULL;//初始化成功
return OK;//1
}
//判空
int ListEmpty(LinkList head){
if(NULL==head->next)
return OK;
return ENDFLAG;//不为空
}
//输入即赋值头插法
int Create_List_Head(LinkList head,int n){
int i;
LNode *p=NULL;
int temp;
if(n<=0)
return ERROR;//参数不合法,创建失败 -1
for(i=n;i>=1;i--){
p=(LNode *)malloc(sizeof(LNode));
if(NULL==p)
return OVERFLOW;//-2内存分配失败导致创建失败
printf("请输入你的%d个数据:\n",i);
scanf("%d",&temp);
p->data=temp;
p->next=head->next;//原首元节点成为新节点的直接后继
head->next=p;//新节点成为首元结点
}
return OK;//1
}
/*
//尾插法插入
int Create_List_Tail(LinkList head,int n){
int i,temp;
LNode *p=NULL,*q=head;//辅助指针q始终指向表尾
if(n<=0)
return ERROR;//-1
for(i=1;i<n;i++){
p=(LNode *)malloc(sizeof(LNode));
if(NULL==p)
return OVERFLOW;//-2
printf("请输入你的%d个数据:\n",i);
scanf("%d",&temp);
p->data=temp;
p->next=NULL;
q->next=p;//将新的节点插入到表尾
q=p;//辅助指针q指向新的表尾
}
return OK;//创建成功
}
*/
//求长度
int LinkList_Length(LinkList head){
int len=0;
LNode *p=head->next;
while(NULL!=p){
len++;p=p->next;
}
return len;
}
//查找数据元素的位置
int LocateElem(LinkList head,int e){
int count=1;
LNode *p=head->next;
while(NULL!=p&&p->data!=e){
p=p->next;count++;
}
if(NULL==p)
return ENDFLAG;//0
return count;
}
//插入
int ListInsert(LinkList head,int i,int e){
int count=0;//count 始终为p节点的位序
LNode *p=head,*q=NULL;
while(count<i+1&&NULL!=p){//寻找第i-1个结点
p=p->next;count++;
}
if(count>i-1||NULL==p)
return ERROR;//-1
q=(LNode *)malloc(sizeof(LNode));
if(NULL==q)
return OVERFLOW;//-2 因为存储分配失败导致插入操作失败
q->data=e;
q->next=p->next;
p->next=q;
return OK;//1
//插入成功
}
//删除
int DeletLinkList(LinkList head,int i,int *e){
int count=0;//count始终为P结点的位序
LNode *p=head,*q=NULL;
if(1==ListEmpty(head))//判空
return ERROR;//-1
while(count<i-1&&NULL!=p){//找第i-1个结点,并保证第i个结点存在
p=p->next;count++;
}
if(count>i-1||NULL==p)
return OVERFLOW;//-2
q=p->next;//让指针q指向要删除的第i个结点
*e=p->data;
p->next=q->next;//删除
free(p);//释放空间
return ENDFLAG;//0
//删除成功
}
//显示
int ShowLinkList(LinkList head){
LNode *p=head->next;
while(NULL!=p){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkList L;
int i,e,l;
if(!InitSqList(&L)){
printf("初始化失败,按任意键退出:");
getch();
exit(0);
}
if(!Create_List_Head){
printf("赋值失败按任意键退出:");
getch();
exit(0);
}
ShowLinkList(L);
printf("是否执行插入操作?1-是");
int j,k;
scanf("%d",&j);
if(j==1)
goto insert;
else
goto delet;
insert:
printf("请输入你要插入的位置:\n");
scanf("%d",&i);
printf("请输入你要插入的数:\n");
scanf("%d",&e);
if(!ListInsert(&L,i,e)){
printf("插入失败按任意键退出:");
getch();
exit(0);
}
ShowLinkList(L);
delet:
printf("\n是否实现删除操作?1-是");
scanf("%d",&k);
if(k==1)
goto yes;
else
exit(0);
yes:
printf("请输入你要删除的数的位置:\n");
scanf("%d",&l);
if(!DeletLinkList(&L,l)){
printf("删除失败按任意键退出:\n");
getch();
exit(0);
}
ShowLinkList(L);
printf("链表基本操作测试已经结束,按任意键退出:\n");
getch();
return 0;
}
标签:
原文地址:http://www.cnblogs.com/100114jerro/p/4998741.html