澳门新葡亰网址下载链表菜单简单版 纯C

by admin on 2020年1月22日

//007.h

//函数结果状态

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
int cmd;
typedef struct Lnode
{
int data;
struct Lnode *next;
}LNode, *Linklist;
void creatList(Linklist &L)
{
LNode *p;
int n,m;
printf(” 先输入一个n,在输入n个数: “);
scanf(“%d”,&n);
//p = (Linklist)malloc(sizeof(LNode));
L = p;
while(n–)
{
LNode *q;
q = (LNode*)malloc(sizeof(LNode));//这一步一定要重新申请内存,不然
q的指向永远不会变,
//导致一个单节点q=p,且自身的next指向自身;
scanf(“%d”,&m);
q->data = m;
p->next = q;
p = q;
}
p->next = NULL;
}
void Print(Linklist &L)
{
LNode *p;
p=L->next;
printf(” 链表输出为”);
while(p!=NULL)
{
printf(“%d “,p->data);
p=p->next;
}
printf(“n”);
printf(” 是否继续 yes 0r no? :”);
char str[4];
scanf(“%s”,str);
if(strcmp(str,”yes”))
return ;
}
void Listinert(Linklist &L, int i, int e)
{
Linklist head = L;
int j = 0;
Linklist p = head;
while (p != NULL&&j < i – 1)
{
j++; p = p->next;
}
if (!p || j > i – 1)
printf(“worryn”);
else
{
Linklist s=new LNode; //= (Linklist)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}
void Listdelete(Linklist &L, int i)
{
int j=0;
Linklist p = L;
Linklist q;
while(p->next&&j<i-1)
{
p=p->next;j++;
}
if(!p->next||(j>i-1))
j=j;
else
{
q=p->next;p->next=q->next;
free(q);
}
}

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define TRUE 1

void length(Linklist &L)
{
LNode *p;
p=L->next;
int l=0;
while(p!=NULL)
{
l++;
p=p->next;
}
printf(“%dn”,l);
printf(” 是否继续 yes 0r no? :”);
char str[4];
scanf(“%s”,str);
if(strcmp(str,”yes”)||strcmp(str,”YES”)||strcmp(str,”Yes”))
int w;
}
void menu()
{ //打印图形界面
printf(” ——-MENU—— “);
printf(“n”);
printf(” ================= “);
printf(“n”);
printf(” Linklist operation n”);
printf(” 1. creat n”);
printf(” 2. insert n”);
printf(” 3. delete n”);
printf(” 4. print n”);
printf(” 5. length n”);
printf(” 6. reverse n”);
printf(” 0. exit n”);
printf(” ================= “);
printf(“n”);
printf(” Choice(0,1,2,3,4,5,6): “);
scanf(“%d”,&cmd);
}
int main()
{
int flag=1,pos,num;
Linklist L1;
do
{ system(“cls”);
menu();
switch(cmd)
{
case 0:
flag=0;break;
case 1:
creatList(L1); break;
澳门新葡亰网址下载,case 2:
printf(” 输入插入的位置和对象: “);
scanf(“%d %d”,&pos,&num);
Listinert(L1,pos,num);
break;
case 3:
printf(” 输入删除的位置: “);
scanf(“%d”,&pos);
Listdelete(L1,pos);break;
case 4:
Print(L1);break;
case 5:
printf(” 链表的长度为: “);
length(L1);
}
}while(flag==1);
}

int over_flag=0;

#define FALSE 0

 

typedef int ElemType;
typedef struct LNode
{
 ElemType data;
 struct LNode *next;
}LNode,*LinkList;

#define OK 1

 

void Traverse(LinkList L);
void CreateList(LinkList &L);
void exchange(LinkList &L);
void delete_even(LinkList &L);
void Insert_Sort(LinkList &L,ElemType e);
void Create_Sort(LinkList &L);
void MergeIncrease(LinkList La,LinkList Lb,LinkList &Lc);
void Divide(LinkList &L);
void InsertList(LinkList &L);
void Locate(LinkList L);
void DeleteList(LinkList &L);

#define ERROR 0

澳门新葡亰网址下载 1

//尾插法建立单链表
void CreateList(LinkList &L)
{  
 int temp;
 L=(LinkList)malloc(sizeof(LNode));
 L->next=NULL;
 LinkList q=L;
 scanf(“%d”,&temp);
 while(temp!=-1)
 {
  LinkList p;
  p=(LinkList)malloc(sizeof(LNode));
  p->data=temp;
  p->next=q->next;
  q->next=p;
  q=q->next;
  scanf(“%d”,&temp);
 }
    Traverse(L);
}

#define INFEASIBLE -1

 

//遍历单链表
void Traverse(LinkList L)
{  
 LinkList t=L->next;
 printf(“结点数值:”);
 while(t)
 {
  printf(“%d”,t->data);
  t=t->next;
 }
 printf(“n”);
}

#define NULL 0

//链表中元素逆置
void exchange(LinkList &L)
{
 LinkList p,s;
    p=L->next;
 L->next=NULL;
 while(p)
 {
  s=p;
  p=p->next;
  s->next=L->next;
  L->next=s;
 }
}

#define OVERFLOW -2

//在单向链表中删除所有偶数元素结点
void delete_even(LinkList &L)
{
 printf(“删除偶数结点后的链表为:n”);
 LinkList q=L;
 LinkList p=L->next;
 while(p)
 {
  if(p->data%2==0)
  {
   LinkList r=p;
   q->next=p->next;
   p=p->next;
   free(r);
  }
            else
   {
        p=p->next;
        q=q->next;
   }
 }
  Traverse(L);
}

#include<iostream>

//非递减有序单向链表中插入元素e,序列仍有序
void Insert_Sort(LinkList &L,ElemType e)
{
 LinkList p,s;
 s=(LinkList)malloc(sizeof(LNode));
 s->data=e;
 p=L;
 while(p->next&&p->next->data<e)
 {
  p=p->next;
  s->next=p->next;
  p->next=s;
 }
}

#include<stdio.h>

//建立递增有序单项链表
void Create_Sort(LinkList &L)
{
 int e;
 L=(LinkList)malloc(sizeof(LNode));
 L->next=NULL;
 printf(“建立递增有序表,输入任意个整型数据以0结束n”);
 scanf(“%d”,&e);
 while(e)
 {
  Insert_Sort(L,e);
  scanf(“%d”,&e);
 }
}

#include<malloc.h>

 

using namespace std;

//建立两个非递减有序单向链表,然后合并成一个仍非递减链表
void MergeIncrease(LinkList La,LinkList Lb,LinkList Lc)
{
 LinkList p,q,s,rear;
 p=La->next;
 q=Lb->next;
 Lc=rear=La;
 free(Lb);
 while(p&&q)
 {
  if(p->data<q->data)
  {
   s=p;
   p=p->next;
  }
  else
  {
   s=q;
   q=q->next;
  }
  rear->next=s;
  rear=rear->next;
 }
 if(p)
  rear->next=p;
 else
  rear->next=q;
}

typedef int Status;//Staus是函数的类型,其值是函数结果

//将链表分解,一个全为奇数,一个全为偶数

typedef int DateType;
//DateType可以使相应任何的数据类型如int、float、char

void Divide(LinkList &L)
{
 printf(“分解成两个链表:n”);
 LinkList A=L;
 LinkList B=(LinkList)malloc(sizeof(LNode));
 B->next=NULL;
 LinkList Lb=B;
 int i=1;
 LinkList La=L;
 LinkList p=L->next;
 while(p)
 {
  if(i++%2==0)
  {
   La->next=p->next;
   p->next=NULL;
   Lb->next=p;
   Lb=Lb->next;
   p=La->next;
  }
  else
  {
   p=p->next;
   La=La->next;
  }
 }
 printf(“链表A:”);
 Traverse(A);
 printf(“链表B:”);
 Traverse(B);
 printf(“已经分解成两个链表!n”);
 over_flag=1;
}

//结点类型定义

//求单链表的长度
int ListLength(LinkList &L)
{
 int i=0;
 LinkList p=L->next;
 while(p)
 {
  p=p->next;
  i++;
 }
 return i;
}

typedef struct LNode

//插入元素
void InsertList(LinkList &L)
{
 int x,i;
 printf(“请输入您要插入的数值和元素的位置:”);
 scanf(“%d%d”,&x,&i);
 LinkList p=L;
 int j=0;
 while(p&&j<i-1)
 {
  p=p->next;
  ++j;
 }
 if(!p||j>i-1)
 {
  printf(“输入位置有误!”);
  return;
 }
 LinkList s=(LinkList)malloc(sizeof(LNode));
 s->data=x;
 s->next=p->next;
 p->next=s;
 Traverse(L);
}

{

//查找元素
void Locate(LinkList L)
{
 if(!L)
  printf(“错误:链表未创建!”);
 int element;
 printf(“查询数值:n输入要查询的数值:”);
 scanf(“%d”,&element);
 LinkList p=L->next;
 int i=1;
 while(p)
 {
  if(p->data=element)
  {
   printf(“找到了,它是链表第%d个元素”,i);
   return;
  }
  p=p->next;
  i++;
 }
 printf(“找不到.n”);
}

     DateType date;//结点的数据域

void GetElem(LinkList L)
{  
 int x,e;
 printf(“请输入您要查找的元素的位置:”);
 scanf(“%d”,&x);
 LinkList p=L->next;
 j=1;
 while(p&&j<i)
 {
  p=p->next;
  ++j;
 }
 if(!p||j>i)
  return 0;
    e=p->data;
 printf(“第%d个结点位置的元素值为:%d”,x,e);
}

     struct LNode *next;//结点的指针域

 

}LNode;

void DeleteList(LinkList &L)
{
 int i;
 LinkList p=L->next;
 printf(“选择位置删除结点:n输入要删除数值的位置:”);
 scanf(“%d”,&i);
 int j=1;
 while(p&&j<i-1)
 {
  p=p->next;
  ++j;
 }
 if(!p||j>i-1)
 {
  printf(“输入位置错误!”);
  return ;
 }
 LinkList q=p->next;
 p->next=q->next;
 free(q);
 Traverse(L);
}

typedef LNode *LinkList;

 

Status InitList_L(LinkList &L)//初始化单链表

主函数

{

 

L =
(LinkList)malloc(sizeof(LNode));//L指向头节点,头节点数据域为空

#include <stdio.h>
#include <stdlib.h>
#include “007.h”
void main()
{
 LinkList La,Lb,Lc;
    char operate;
 
 do
 {
        printf(“Attt建立无序单向链表,
并进行下一步操作(插入、删除、查找)n”);
  printf(“Bttt建立递增有序链表,再逆置tttn”);
  printf(“Cttt建立两个递增有序表,将它们合并为一个仍递增表n”);
  printf(“Dttt建立两个递增有序表,将它们合并为一个非递增链表n”);
  printf(“Ettt将无序链表分解为两个链表n”);
  printf(“Fttt删除所有偶数元素的结点n”);
  printf(“Qttt退出n”);
  scanf(“%c”,&operate);
  switch(operate)
  {
  case a:
  case A:
            {
    CreateList(La);
    int select;
    do{
     printf(“
   }
   break;
  case b:
  case B:
   break;
  case c:
  case C:
   break;
  case d:
  case D:
   break;
  case e:
  case E:
   break;
  case f:
  case F:
   break;
  case q:
  case Q:
   break;
  }while(operate)
 }
}

L->next=NULL;

 

return 1;

}

Status DispList_L(LinkList &L)//输出单链表

{

LinkList p
= L->next;

while(p !=
NULL)

{

printf(“%d
“,p->date);

p =
p->next;

}

return OK;

}

Status CreateListTou(LinkList &L,int
n)//头插法创建长度为n的单链表,带头结点

{

int i;

printf(“请输入要创建的链表的长度:n”);

scanf(“%d”,&n);

LNode *p;

L =
(LinkList)malloc(sizeof(LNode));

L->next
= NULL;
//先建立一个带头结点的单链表

printf(“请输入元素值:n”);

for(i = n;i
> 0;i–)

{

p =
(LinkList)malloc(sizeof(LNode));//生成新结点

scanf(“%d”,&p->date);//输入元素值

p->next
= L->next;//使新结点指向链首

L->next
= p;//插入到表头

}

return OK;

}

Status ListLength_L(LinkList L) //求单链表的长度

{

LinkList
p=L;

int n=0;

while(p->next!=NULL)

{

n++;

p=p->next;

}

return(n);

}// ListLength_L

Status ListEmpty_L(LinkList L)
//判断单链表是否为空,若为空返回TRUE,否则返回FALSE

{

if(L->next == NULL)

return
TRUE;

else 

return
FALSE;

}

Status DestroyList_L(LinkList &L) //销毁一个单链表

{

LinkList p
= L,q = p->next;

while(q !=
NULL)

{

free(p);

p = q;

q =
p->next;

}

free(p);

return OK;

}

Status GetElem_L(LinkList L, int i, DateType &e)
//用e返回L中第i个数据元素的值

{

//
L为带头结点的单链表的头指针。

//
当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR

int j=0;

LinkList
p=L;//初始化,p指向第一个结点,j为计数器

while(j
< i && p != NULL)//顺时针向后查找,直到p指向第i个元素或p为空

{

p =
p->next;

++j;

}

if(!p || j
> i)

return
ERROR;//第i个元素不存在

e =
p->date;//取第i个元素

return OK;

}

Status LocateElem_L(LinkList L,DateType
e)//在链表中按元素值查找,返回该元素在链表中的位序

{

LinkList p
= L->next;

int i = 1;

while(p !=
NULL && p->date != e)//判断待查找结点的值是否与待定值相等

{

p =
p->next;

i++;

}

if(p)

printf(“查找成功!是第%d个元素。n”,i);

return  OK;

}

Status ListInsert_L(LinkList &L,int i,DateType
e)//在带头结点的单链表L中第i个位置之前插入元素e

{

LinkList p
= L,s;

int j = 0;

/*

找到插入节点的上一个元素,如果是头节点则退出,当i=1时表示头节点,i=2时,表示第一个元素

*/

while(p !=
NULL && j < i – 1)//寻找第i-1个节点

{

j++;

p =
p->next;//移向下一个结点

}

if(p ==
NULL)//i小于1或者大于表长加1,不能插入

{

getchar();

printf(“Insert error!Any key to continue.n”);

getchar();

return
ERROR;

}

else

{

s =
(LinkList)malloc(sizeof(LNode));//生成新结点

s->date
= e;//插入

s->next
= p->next;

p->next
= s;

getchar();

printf(“Success!Any key to continue.n”);

DispList_L(L);

getchar();

return  OK;

}

}//时间复杂度为O(n)

Status ListDelete_L(LinkList &L,int i,DateType
&e)//在带头结点的单链表L中,删除第i个元素并返回其值

{

LinkList p
= L,s;

int j = 0;

while(p->next && j < i – 1)//寻找第i个节点,并指向其前驱

{

++j;

p =
p->next;//移向下一个结点

}

if(!(p->next) || j > i – 1)//删除位置不合理

{

getchar();

printf(“Delete error!Any key to continue.n”);

getchar();

return
ERROR;

}

else

{

s =
p->next;

p->next
= s->next;//从链表中删除

e =
s->date;

free(s);//释放s

return  OK;

}

}//时间复杂度为O(n)

Status InversionList_L(LinkList &L)//将一个链表逆置

{

LinkList p
= L->next,q = L->next;

L->next=NULL;

while(p !=
NULL)

{

q =
q->next;

p->next=L->next;

L->next=p;

p=q;

}

return OK;

}

/*void  ListInverse_L(LinkList &L)

{

//—-单链表的就地逆置—-//

LNode
*p,*q;

   
p=L->next;

L->next=NULL;

   
while(p!=NULL)

{

        q=p->next;

p->next=L->next;

L->next=p;

p=q;

    }

 }*/

Status MaxAndMinList_L(LinkList L,DateType &e1,DateType
&e2)//找最大值最小值并返回其值

{

LinkList p
= L->next,q = L->next;

int max =
p->date,min = p->date;

while(p !=
NULL)

{

if(p->date >= max)

max =
p->date;

if(p->date <= min)

max =
p->date;

p =
p->next;

}

e1 = max;

e2 = min;

printf(“最大值为:%dn”,e1);

printf(“最小值为:%dn”,e2);

return OK;

}

Status ListMerge_L(LinkList &La,LinkList &Lb,LinkList &Lc)//将A
表和B表归并成一个按元素值递减有序排列的线性表C

{

return OK;

}

Status ListDelete1_L(LinkList &L,DateType mink,DateType
maxk)//在线性单链表中删除值介于mink和maxk之间的结点,并输出删除后的链表

{

LinkList p
= L,q;

if(mink
>= maxk)

return
ERROR;

while(p->next != NULL)

{

if(p->next->date > mink && p->next->date <
maxk)

{

q =
p->next;

p->next
= q->next;//从链表中删除

free(q);//释放q

}

else

p =
p->next;

}

cout
<< “After delete:” << endl;

DispList_L(L);

return OK;

}

void output()//边框

{

     int i;

     for(i = 0;i < 10;i ++)

        printf(” “);

     for(i = 0;i < 39;i ++)

        printf(“*”);

     printf(“n”);

}

void mainpp()//显示窗口

{

     int i;

     output();

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*   “);

     printf(“1.建立一个单链表”);

     for(i = 0;i < 18;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*   “);

     printf(“2.输出一个单链表”);

     for(i = 0;i < 18;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*   “);

     printf(“3.在顺序表中查找元素位序”);

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*”);

        printf(“n”);

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*   “);

printf(“4.求单链表的长度”);

     for(i = 0;i < 18;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i ++)

        printf(” “);

        printf(“*   “);

     printf(“5.判断单链表中是否为空”);

     for(i = 0;i < 12;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

     printf(“6.从销毁一个单链表”);

     for(i = 0;i < 16;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“7.求第i个数据元素的值”);

     for(i = 0;i < 13;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“8.求元素e在链表中的位序”);

     for(i = 0;i < 11;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“9.在单链表L中第i个位置之前插入e”);

     for(i = 0;i < 3;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“10.删除单链表L中第i个元素并返回”);

     for(i = 0;i < 3;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“11.将链表逆置”);

     for(i = 0;i < 21;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“12.找出链表中的最值”);

     for(i = 0;i < 15;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

printf(“13.删除表中介于mink与maxk的元素”);

     for(i = 0;i < 3;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     for(i = 0;i < 10;i++)

        printf(” “);

        printf(“*   “);

     printf(“0.退           出 “); 

     for(i = 0;i < 16;i++)

        printf(” “);

        printf(“*”);

        printf(“n”); 

     output(); 

}

int main()

{     

int n =
0,i,j,f,m,k = 1,d = 0,t = 0,h = 0,g = 0,a[] =
{0},x,y,z,e1,e2,mink,maxk;

LinkList l;

InitList_L(l);//初始化单链表

mainpp();

    while(k) 

{

printf(“请选择0–13:”);

scanf(“%d”,&m);

getchar();

switch(m)

{

case
0:exit(0);

case 1:

{

CreateListTou(l,n);

printf(“建立的单链表为:n”);

DispList_L(l);

printf(“n”);

break;

}

case 2:

{

DispList_L(l);

printf(“n”);

break;

}

case 3:

{

printf(“Input date:”);

scanf(“%d”,&x);

d =
LocateElem_L(l,x);

printf(“要查找的元素的定位:%dn”,k);

                printf(“n”);

                break;

}

case 4:

{

t =
ListLength_L(l);

printf(“该链表的长度为:%dn”,t);

break;

}

case 5:

{

if(ListEmpty_L(l))

printf(“该链表为空!n”);

else 

printf(“该链表不为空!n”);

break;

}

case 6:

{

if(DestroyList_L(l))

printf(“Destroy Success!n”);

else

printf(“Destroy Fail!n”);

break;

}

case 7:

{

printf(“请输入要取的元素的位序号:”);

fflush(stdin);

scanf(“%d”,&i);

h =
GetElem_L(l,i,x);

printf(“该链表中第%d个元素为:%dn”,i,h);

break;

}

case 8:

{

printf(“Input date::”);

scanf(“%d”,&x);

g =
LocateElem_L(l,x);

printf(“要查找的元素%d的位序为:%dn”,x,g);

break;

}

case 9:

{

printf(“Input position:”);

scanf(“%d”,&j);

printf(“Input date:”);

scanf(“%d”,&y);

ListInsert_L(l,j,y);

printf(“n”);

break;

}

case 10:

{

printf(“请输入要删除的位置:”);

scanf(“%d”,&f);

ListDelete_L(l,f,z);

printf(“Success!Any key to continue.n”);

printf(“The
date is %d.n”,z);

printf(“After Delete:n”);

DispList_L(l);

break;

}

case 11:

{

InversionList_L(l);

printf(“After Inversion:n”);

DispList_L(l);

break;

}

case 12:

{

MaxAndMinList_L(l,e1,e2);

break;

}

case 13:

{

cout
<< “Input mink and maxk.” <<endl;

cin
>> mink >> maxk;

ListDelete1_L(l,mink,maxk);

printf(“n”);

break;

}

default
:exit(0);

}

printf(“继续运行吗?Y(1)/N(0):”);

scanf(“%d”,&k);

if(k == 0)

exit(0); 

}

return 0;

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图