数据结构5带头节点单链表

来源:互联网 发布:广西广电网络电视收费 编辑:程序博客网 时间:2024/05/19 13:30
/*
 本次操作是对带头节点单链表的操作  包括删除  插入 判空 建立 
 包括删除插入函数  显示函数
 目的是为了对单链表做一个基本操作的总结----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;
}
0 0
原创粉丝点击