数据结构-链表代码实现

来源:互联网 发布:好用的mac清理软件 编辑:程序博客网 时间:2024/05/29 17:11
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
 int data;
 struct Node * pNext;
}NODE, *PNODE;

//函数声明
void show();
PNODE create_list();
int length_list(PNODE pHead);
bool insert_list(PNODE pHead, int pos, int val);
bool delete_list(PNODE pHead, int pos);
void traverse_list(PNODE pHead);
bool is_empty(PNODE pHead);
void getValue(PNODE pHead , int pos);
int getPos(PNODE pHead , int val);
bool destory(PNODE pHead);
void show(PNODE pHead);
void getPrior(PNODE pHead , int val);
void getNext(PNODE pHead,int val);
PNODE init_List(PNODE L);
int main() {
 int i;
 int pos;
 int val;
 PNODE  pHead ;
 show();
 int inti_Number = 0;
 int inti_valNumber = 0;
 do{
  scanf("%d",&i);
  switch (i) {
  case 1:
   if(inti_Number == 0) {
    pHead = init_List(pHead);
   }
   inti_Number++;
   break;
  case 2:
   if(inti_Number >0) {
   destory(pHead);
   inti_Number =0;
   inti_valNumber = 0;
   } else {printf("请初始化!\n");}
   break;
  case 3:
   if(inti_Number >0) {
   printf("该链表中元素的个数是:%d\n",length_list(pHead));
   } else {printf("请先初始化元素的值!\n");}
   break;
  case 4:
   if(inti_Number >0 && inti_valNumber > 0 ) {
    int num ;
    printf("请输入一个位置:\n");
    scanf("%d",&num);
    getValue(pHead,num);
   } else {printf("请先初始化元素的值!\n");}
   
   break;
  case 5:
   if(inti_Number >0 && inti_valNumber > 0) {
    printf("请输入一个元素:\n");
    scanf("%d",&val);
    if(getPos(pHead,val) > 0)
    printf("该元素的位置是:%d\n",getPos(pHead ,  val));
   } else {printf("请先初始化元素的值!\n");}
   break;
  case 6:
   int val;
   if(inti_Number >0  && inti_valNumber > 0) {
   printf("请输入一个值:\n");
   scanf("%d",&val);
   getPrior(pHead ,val);
   }
   else {
    printf("请先初始化元素的值!\n");
   }
   break;
  case 7:
   if(inti_Number >0  && inti_valNumber > 0) {
   printf("请输入一个值:\n");
   scanf("%d",&val);
   getNext(pHead,val);
   } else {printf("请先初始化元素的值!\n");}
   break;
  case 8:
   if(inti_Number >0 ) {
   printf("请输入您要插入元素的位置以及内容:\n");
   scanf("%d %d", &pos, &val);
    insert_list(pHead, pos,  val);
   } else {printf("请先初始化!\n");}
   
   break;
  case 9:
   if(inti_Number >0  && inti_valNumber > 0) {
    int num;
    printf("请输入你要想删除的链表位置:\n");
    scanf("%d",&num);
    if (delete_list(pHead, num))
    printf("删除成功\n");
    else
    printf("删除失败!您删除的元素不存在!\n");
   } else {printf("请先初始化元素的值!\n");}
   
  
   break;
  case 10:
   if(inti_Number >0 ) {
    show(pHead);
   } else {printf("请先初始化\n!");}
   break;
  case 11:
   if(inti_Number >0) {
   pHead = create_list();
   inti_valNumber ++;
   } else {printf("请先初始化!\n");}
   
   break;
  case 12:
   i = 12;
   break;
  default :
   break;
  }
  printf("请继续选择:");
 } while (i!=12);
 
 return 0;
}
void show() {
 printf("可执行操作有:\n");
 printf("*****************************************************************\n");
 printf("*****************    1.初始化或重置链表         *****************\n");
 printf("*****************    2.销毁链表                 *****************\n");
 printf("*****************    3.链表中元素个数           *****************\n");
 printf("*****************    4.所指位序的元素值         *****************\n");
 printf("*****************    5.链表已存在元素位序       *****************\n");
 printf("*****************    6.请输入元素,求直接前驱 *****************\n");
 printf("*****************    7.请输入元素,求直接后继 *****************\n");
 printf("*****************    8.在第i个位置插入元素      *****************\n");
 printf("*****************    9.删除第i个元素            *****************\n");
 printf("*****************    10.输出所输入的链表元素 *****************\n");
 printf("*****************    11.初始化并输入链表元素 *****************\n");
 printf("*****************    12.退出                    *****************\n");
 printf("*****************************************************************\n");
 printf("请输入你的选择:\n");
}
//创建一个链表
PNODE create_list() {
 int len;//用来存放有效节点个数
 int i;
 int val;//用来临时存放用户输入的结点值
 printf("请输入您要生成链表结点的个数:");
 scanf("%d", &len);
  PNODE pHead = (PNODE)malloc(sizeof(NODE));
  PNODE pTail = pHead;
  pTail->pNext = NULL;
  for (i = 0; i < len; i++) {
   printf("请输入第%d个节点的值:",i+1);
   scanf("%d",&val);
   PNODE pNew = (PNODE)malloc(sizeof(NODE));
   if (NULL == pNew) {
    printf("内存分配失败!\n");
    exit(-1);
   }
   pNew->data = val;
   pTail->pNext = pNew;
   pNew->pNext = NULL;
   pTail = pNew;

 }
  return pHead;
}
//计算链表长度
int length_list(PNODE pHead) {
 PNODE p = pHead;
 int len = 0;
 while (NULL != p) {
  len++;
  p = p->pNext;
 }
 return len-1;
}

//插入元素
//在pHead所指向链表的第pos个节点的前面插入一个新的节点,新的节点的值是val,并且pos的值是从1开始

bool insert_list(PNODE pHead, int pos, int val) {
 int i = 0;
 PNODE p = pHead;
 while (NULL != p && i < pos - 1) {
  p = p->pNext;
  ++i;
 }
 if (i > pos - 1 || NULL == p){
  printf("输入值不合法!\n");
  return false;
 }
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if (NULL == pNew) {
  printf("动态分配内存失败!\n");
  exit(-1);
 }
 pNew->data = val;
 PNODE q = p->pNext;
 p->pNext = pNew;
 pNew->pNext = q;
 return true;
}

//删除一个链表
bool delete_list(PNODE pHead, int pos) {
 int i = 0;
 PNODE  p = pHead;
 while (NULL != p->pNext && i < pos - 1) {
  p = p->pNext;
  ++i;
 }
 if (i > pos - 1 || NULL == p->pNext)
  return false;
 PNODE q = p->pNext;
 //删除p节点后面的结点
 p->pNext = p->pNext->pNext;
 free(q);
 q = NULL;
 return true;
}
//摧毁链表
bool destory(PNODE pHead) {

 free(pHead);
 pHead = NULL;
 printf("链表摧毁成功!\n");
 return true;
}

//遍历一个链表
void traverse_list (PNODE pHead) {
 PNODE p = pHead ->pNext;
 while(NULL != p) {
  printf("%d",p->data);
  p=p->pNext;//不连续,不能用p++
 }
 printf("\n");
 return;
}

//判断一个链表是否为空
bool is_empty(PNODE pHead) {
 if(pHead -> pNext == NULL) {
  return true;
 } else {return false;}
}
//判断一个链表是否已满
bool is_full(PNODE pHead) {
 return true;
}
//初始化链表
PNODE init_List(PNODE pHead) {
 pHead  = NULL;
 printf("已经初始化!\n");
 return pHead;
}
//查找指定位置的值
void getValue(PNODE pHead , int pos) {
 PNODE p = pHead;
 int n = 0;
 if(pos < 1 || pos > length_list(p)) {
  printf("输入值不合法!\n");
  return ;
 } else {
  while( n < pos) {
   p = p->pNext;
   n++;
  }    
  printf("该元素是%d\n",p->data);
 }
}
//查找元素的位置
int getPos(PNODE pHead , int val) {
 PNODE p = pHead;
  int pos ;
  int len = length_list(p);
  for(pos = 0 ; pos <= len ; pos++ ) {
   if( val == p->data)
    break;
   else
    p=p->pNext;     
  }
  if(pos <= len){
   return pos;
  }
  else {
  printf("该值不存在!\n");
  return 0;
  }
 
 }
//求前驱
void getPrior(PNODE pHead , int val){
 PNODE p;
 p = pHead;
 int pos = getPos(p , val);
 if(pos <= 1 ) {
 printf("输入不合法!\n");
 return ;
 }
 while(p->pNext->data != val ) {
 p = p -> pNext;
 }
 printf("该元素的前驱结点是:%d\n",p->data);
 return;
}
//求后继 
void getNext(PNODE pHead,int val){
  PNODE p = pHead;
  int n = getPos(p , val);
  if(n>= length_list(p)) {
  printf("输入值不合法!\n");
  return;
  } 
  while(p->data != val) {
  p = p->pNext;
  }
  printf("该元素的求后继结点是:%d\n",p->pNext->data);
}
//输出所输入链表元素
void show(PNODE pHead) {
  PNODE p = pHead->pNext;
  while(NULL!= p){
  printf("%-5d",p->data);
  p=p->pNext;
  }
  printf("\n");
 return;
}
//销毁链表