链表的创建和操作

//链式结构
#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;
}

感谢来访,共同学习!
原文地址:https://www.cnblogs.com/dingxiaowei/p/3058844.html