链表的创建和操作

//链式结构
#include <stdio.h>
#include<stdlib.h>
#include <malloc.h>

#define MAXSIZE 1000

typedef char ElemType;

typedef struct LNode{//定义单链表结点类型
 ElemType data;
 struct LNode *next;
}LinkList;

void InitList(LinkList *&L){//带头结点的单链表
 L = (LinkList *)malloc(sizeof(LinkList));
 L -> next = NULL;
}

void DestroyList(LinkList *&L){
 LinkList *p = L,*q = p -> next;
 while(q != NULL){
  free(p);
  p = q;
  q = p -> next;
 }
 free(p);
}

int ListEmpty(LinkList *L){
 return(L -> next == NULL);
}

int ListLength(LinkList *L){
 LinkList *p = L;int i = 0;
 while(p -> next != NULL){
  i++;
  p = p -> next;
 }
 return(i);
}

void DispList(LinkList *L){
 LinkList *p = L -> next;
 while (p != NULL){
  printf("%c",p -> data);
  p = p -> next;
 }
 printf("\n");
}

int GetElem(LinkList *L,int i,ElemType &e){
 int j = 0;
 LinkList *p =L;
 while(j < i && p != NULL){
  j++;
  p = p -> next;
 }
 if (p == NULL)
  return 0;
 else {
  e = p -> data;
  return 1;
 }
}

int LocateElem(LinkList *L,ElemType e){
 LinkList *p = L -> next;
 int n = 1;
 while(p != NULL && p -> data != e){
  p = p -> next;
  n++;
 }
 if(p == NULL)
  return(0);
 else
  return(n);
}

int ListInsert(LinkList *&L,int i,ElemType e){
 int j = 0;
 LinkList *p = L,*s;
 while (j < i-1 && p != NULL){
  j++;
  p = p -> next;
 }
 if(p == NULL)//未找到第i-1个结点
  return 0;
 else  //找到第i-1个结点*p
 {
  s = (LinkList *)malloc(sizeof(LinkList));//创建新结点*s
  s -> data = e;
  s -> next = p -> next;    //将*s插入到*p之后
  p -> next = s;
  return 1;
 }
}

int ListReplace(LinkList *&L,int i,ElemType e){//替换
 int j = 0;
 LinkList *p = L;
 while(j < i && p != NULL){
  j++;
  p = p -> next;
 }
 if (p == NULL)//未找到第i-1个结点*p
  return 0;
 else{  //找到第i-1个结点
  p -> data = e;
  return 1;
 }
}

int ListDelete(LinkList *&L,int i,ElemType &e){
 int j = 0;
 LinkList *p = L,*q;
 while(j < i-1 && p != NULL){
  j++;
  p = p -> next;
 }
 if (p == NULL)  //未找到第i-1个结点
  return 0;
 else{    //找到第i-1个结点*p
  q = p -> next;  //q指向要删除的结点
  if(q == NULL) return 0;
  e = q -> data;
  p -> next = q -> next;//从单链表中删除*q结点
  free(q);   //释放*q结点
  return 1;
 }
}

 


void showmenu(){
 
 printf("\n\n\n");
 printf("  --线性表的基本运算--   \n");
 printf("********************************************\n");
 printf("* 1-----插入一个新元素到第i个位置    *\n");
 printf("* 2-----删除第i个位置的元素    *\n");
 printf("* 3-----存一个新元素到第i个位置    *\n");
 printf("* 4-----显示链表中的所有元素值    *\n");
 printf("* 5-----检索表中第i个元素     *\n");
 printf("* 6-----求表的长度     *\n");
 printf("*        *\n");
 printf("* 0-----退出      *\n");
 printf("********************************************\n");
 printf("请选择菜单号(0--6):");
}

void clear()      //自动清屏
{
 system("pause");
 system("cls");
}

void Charu()
{
 char choice = 'N';
 ElemType item;
 int Position;

 LinkList *L;
 InitList(L); //创建一个顺序表
 printf("请输入一个新元素的值:");
   flushall();
   scanf("%c",&item);
   printf("请输入插入的位置:");
   scanf("%d",&Position);
   if (ListInsert(L,Position,item)){
    printf("插入成功! \n");
   }
   else{
    printf("插入失败!请检查输入位序号是否正确\n");
   }
}

void Shanchu()
{
 char choice = 'N';
 ElemType item;
 int Position;

 LinkList *L;
 InitList(L); //创建一个顺序表
 printf("请输入要删除元素的位置序号:");
   scanf("%d",&Position);
   if(ListDelete(L,Position,item)){
    printf("删除的元素为 %c \n",item);
   }
   else{
    printf("删除失败! 请减产输入位序号是否正确 \n");
   }
}
void Xiugai()
{
 char choice = 'N';
 ElemType item;
 int Position;

 LinkList *L;
 InitList(L); //创建一个顺序表

 printf("请输入一个新元素的值");
   flushall();
   scanf("%c",&item);
   printf("请输入该元素的存放位置:");
   scanf("%d",&Position);
   if (ListReplace(L,Position,item)){
    printf("操作成功! \n");
   }
   else{
    printf("操作失败! 请检查输入位序号是否正确\n");
   }
}

void Jiansuo()
{
 char choice = 'N';
 ElemType item;
 int Position;

 LinkList *L;
 InitList(L); //创建一个顺序表
 printf("请输入元素为序号:");
   scanf("%d",&Position);
   if(GetElem(L,Position,item)){
    printf("第%d个元素为:%c\n",Position,item);
   }
   else{
    printf("输入的位序号错误! \n");
   }
}
void LineOP2(){
 char choice = 'N';
 ElemType item;
 int Position;

 LinkList *L;
 InitList(L); //创建一个顺序表

 while(choice != '0'){
  showmenu();
  flushall();
  scanf("%c",&choice);
  switch(choice){
  case '1':
   Charu();
   clear();
   break;

  case '2':
   Shanchu();
   clear();
   break;

  case '3':
   Xiugai();
   clear();
   break;

  case '4':
   DispList(L);
   break;

  case '5':
   Jiansuo();
   clear();
   break;

  case '6':
   printf("线性表的长度为%d\n",ListLength(L));
   break;

  case '0':
   printf("\n\t程序结束! \n");
   DestroyList(L);
   break;

  default:
   printf("\n\t选择错误,请重新输入!\n");
   break;
  }
 }
}

int main(){
 LineOP2();
 return 0;
}

链表的创建和操作链表的创建和操作链表的创建和操作链表的创建和操作链表的创建和操作链表的创建和操作

上一篇:机器学习笔记(6):多类逻辑回归-使用gluon


下一篇:机器学习笔记(4):多类逻辑回归-使用gluton