注册 登录
编程论坛 数据结构与算法

讨论--怎样能使程序循环呢(关于单链表)蛮有意思的。。。

Angel乖乖 发布于 2011-11-11 21:56, 582 次点击
#include<stdio.h>
#include <stdlib.h>
#define null 0


typedef struct node
{
     char data;
     struct node *next;
}lnode;


lnode *create()
{
   lnode *head,*tail,*p;
   char x;

   head=(lnode *)malloc(sizeof(lnode));
   tail=head;

   x=getchar();
   while(x!='$')
   {
      p=(lnode *)malloc(sizeof(lnode));
      p->data=x;
      tail->next=p;
      tail=p;
      x=getchar();
   }

   tail->next=null;

   return head;
}
void Insert(lnode *p,char x)
{
    lnode *s=(lnode *)malloc(sizeof (lnode));
    s->data=x;
    s->next=p->next;
    p->next=s;
}

void Delete(lnode *h,char x)
{
    lnode *q,*p=h;
    while(p&&p->next)
        if(p->next->data==x)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        else
            p=p->next;
}


lnode *nizhi(lnode *h)
{
  lnode *back,*p,*front;

  back=null;
  p=h->next;
  h->next=null;

  while(p!=null)
  {
     front=p->next;
     p->next=back;
     back=p;
     p=front;
  }

  h->next=back;

  return h;
}

void print(lnode *h)
{
   lnode *p=h->next;

   while(p)
   {
      printf("%c ",p->data);
      p=p->next;
      }
   
}

void main()
{
    lnode *x,*y;
    int a,b,c;
    printf("请输入字符串\n");
    x=create();
    printf("请选择您需要的功能:\t0---逆置\t1---插入\t2---删除");
    a=getchar();
    a=getchar();
    switch(a)
    {
    case '0':
            x=nizhi(x);
            print(x);
            printf("\n");
            getchar();
            break;
    case '1':
            printf("请输入将要插入的字母:");
            c=getchar();
            c=getchar();
            Insert(x,c);
            print(x);
            printf("\n");
            getchar();
            break;
    case '2':
            printf("请输入将要删除的字母:");
            b=getchar();
            b=getchar();
            Delete(x,b);
            printf("\n");
            getchar();
            break;

    }

printf("请选择\t0---逆置\t1---插入\t2---删除");
getchar();

   
   
}


我想实现继续选择,怎么办呢???
有一个想法----想将switch单独设个函数,但不知道怎么实现。。。。
谁知道呢??
讨论一下。。。

9 回复
#2
Angel乖乖2011-11-11 22:01
有没有人呢,留个爪呀。。。
讨论讨论嘛。。。
#3
Angel乖乖2011-11-11 22:07
留个爪嘛。。。
#4
Angel乖乖2011-11-11 22:09
都没有人理我。。。。
#5
Toomj2011-11-11 23:19
main函数里设个循环就好了,下面是我写的:
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    char data;
    struct node* next;
}Node,*LinkList;

LinkList CreateList();
void ListInsert(LinkList& L);
void ElemDelete(LinkList& L);
void OutList(LinkList L);

int main()
{
    int a;
    printf("------------------------------\n");
    printf("*****链表*****\n");
    printf("  1.创建.\n");
    printf("  2.插入\n");
    printf("  3.删除节点.\n");
    printf("  4.打印链表.\n");
    printf("  0.退出.\n");
    printf("------------------------------\n");
    printf("\n请选择(0~4):");
    scanf("%d",&a);
    while(a)
    {
        switch(a)
        {
        case 1:
            LinkList L;
            L=CreateList();
            break;
        case 2:
            ListInsert(L);
            break;
        case 3:
            ElemDelete(L);
            break;
        case 4:
            OutList(L);
            break;      
        }
        printf("\n请选择(0~4):");
        scanf("%d",&a);
    }
    return 0;
}

LinkList CreateList()
{//构造链表,输入数据并以'#'结束
    LinkList L=(Node*)malloc(sizeof(Node));
    Node *p,*rear=L;
    char ch;
    printf("构造链表,输入数据并以'#'结束 \n");
    printf("请输入节点数据('#'结束):");
    _flushall();
    scanf("%c",&ch);
    while(ch!='#')
    {
        p=(Node*)malloc(sizeof(Node));
        p->data=ch;
        rear->next=p;
        rear=p;
        printf("请输入节点数据('#'结束):");
        _flushall();
        scanf("%c",&ch);
    }
    rear->next=NULL;
    return L;
}

void ListInsert(LinkList& L)
{//在第i个位置后插入e
    printf("在第i个位置后插入新数据e\n请输入i和e: ");
    int i;
    char e;
    scanf("%d %c",&i,&e);
    Node *p,*q;
    p=L;
    q=(Node*)malloc(sizeof(Node));
    q->data=e;
    while(i--)
        p=p->next;
    q->next=p->next;
    p->next=q;
}

void ElemDelete(LinkList& L)
{//删除第i个位置的值
    printf("删除第i个位置的节点\n请输入i:");
    int i;
    scanf("%d",&i);
    Node *p,*q;
    p=L;
    while(i-->1)
        p=p->next;
    q=p->next;
    p->next=q->next;
    printf("删除的是:%c",q->data);
    free(q);
}

void OutList(LinkList L)
{//输出链表
    printf("输出链表: ");
    Node *p;
    p=L->next;
    while(p)
    {   
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

#6
Angel乖乖2011-11-12 15:54
回复 5楼 Toomj
我已经根据你的程序改了,可是还是不行。。。你在帮我看看错哪里了
#include<stdio.h>
#include <stdlib.h>
#define null 0


typedef struct node
{
     char data;
     struct node *next;
}lnode;


lnode *create()
{
   lnode *head,*tail,*p;
   char x;

   head=(lnode *)malloc(sizeof(lnode));
   tail=head;

   x=getchar();
   while(x!='$')
   {
      p=(lnode *)malloc(sizeof(lnode));
      p->data=x;
      tail->next=p;
      tail=p;
      x=getchar();
   }

   tail->next=null;

   return head;
}
void Insert(lnode *p,char x)
{
    lnode *s=(lnode *)malloc(sizeof (lnode));
    s->data=x;
    s->next=p->next;
    p->next=s;
}

void Delete(lnode *h,char x)
{
    lnode *q,*p=h;
    while(p&&p->next)
        if(p->next->data==x)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        else
            p=p->next;
}


lnode *nizhi(lnode *h)
{
  lnode *back,*p,*front;

  back=null;
  p=h->next;
  h->next=null;

  while(p!=null)
  {
     front=p->next;
     p->next=back;
     back=p;
     p=front;
  }

  h->next=back;

  return h;
}

void print(lnode *h)
{
   lnode *p=h->next;

   while(p)
   {
      printf("%c ",p->data);
      p=p->next;
      }
   
}

void main()
{
    lnode *x,*y;
    int a,b,c;
    printf("请输入字符串\n");
    x=create();
    printf("请选择您需要的功能:\n0---退出\t1---逆置\t2---插入\t3---删除");
    a=getchar();
    a=getchar();
    while(a)
    {
        switch(a)
        {
        case '1':
            x=nizhi(x);
            print(x);
            printf("\n");
            getchar();
            break;
        case '2':
            printf("请输入将要插入的字母:");
            c=getchar();
            c=getchar();
            Insert(x,c);
            print(x);
            printf("\n");
            getchar();
            break;
        case '3':
            printf("请输入将要删除的字母:");
            b=getchar();
            b=getchar();
            Delete(x,b);
            print(x);
            printf("\n");
            getchar();
            break;
   
        }

    printf("请继续选择\t0---退出\t1---逆置\t2---插入\t3---删除");
    scanf("%d",&a);
    }

   
   
}
只显示。。。却不实现。。。
拜托你了。。。

#7
Toomj2011-11-12 16:32
你的a是int型的,干嘛你用getchar();而且case后面还是字符型‘1’。。。
程序代码:
#include<stdio.h>
#include <stdlib.h>
#define null 0


typedef struct node
{
     char data;
     struct node *next;
}lnode;


lnode *create()
{
   lnode *head,*tail,*p;
   char x;

   head=(lnode *)malloc(sizeof(lnode));
   tail=head;

   x=getchar();
   while(x!='$')
   {
      p=(lnode *)malloc(sizeof(lnode));
      p->data=x;
      tail->next=p;
      tail=p;
      x=getchar();
   }

   tail->next=null;

   return head;
}
void Insert(lnode *p,char x)
{
    lnode *s=(lnode *)malloc(sizeof (lnode));
    s->data=x;
    s->next=p->next;
    p->next=s;
}

void Delete(lnode *h,char x)
{
    lnode *q,*p=h;
    while(p&&p->next)
        if(p->next->data==x)
        {
            q=p->next;
            p->next=q->next;
            free(q);
        }
        else
            p=p->next;
}


lnode *nizhi(lnode *h)
{
  lnode *back,*p,*front;

  back=null;
  p=h->next;
  h->next=null;

  while(p!=null)
  {
     front=p->next;
     p->next=back;
     back=p;
     p=front;
  }

  h->next=back;

  return h;
}

void print(lnode *h)
{
   lnode *p=h->next;

   while(p)
   {
      printf("%c ",p->data);
      p=p->next;
      }
  
}

int main()
{
    lnode *x,*y;
    int a,b,c;
    printf("请输入字符串\n");
    x=create();
    printf("请选择您需要的功能:\n0---退出\t1---逆置\t2---插入\t3---删除");
    scanf("%d",&a);
    while(a)
    {
        switch(a)
        {
        case 1:
            x=nizhi(x);
            print(x);
            printf("\n");
            getchar();
            break;
        case 2:
            printf("请输入将要插入的字母:");
            c=getchar();
            c=getchar();
            Insert(x,c);
            print(x);
            printf("\n");
            getchar();
            break;
        case 3:
            printf("请输入将要删除的字母:");
            b=getchar();
            b=getchar();
            Delete(x,b);
            print(x);
            printf("\n");
            getchar();
            break;
   
        }

    printf("请继续选择\t0---退出\t1---逆置\t2---插入\t3---删除");
    scanf("%d",&a);
    }
    return 0;   
}


如果你想用字符型的话,把a改为char型,switch()语句里再加个
case '0':exit(0);
#8
Angel乖乖2011-11-12 16:53
回复 7楼 Toomj
主函数必须是int型吗??
我用void就不行
#9
Sv少2011-11-12 16:54
根据ASCII码对照表,你输入的0 1 2 3分别对应48 49 50 51;
你或者改动源程序直接变为 scanf("%d",&a);并将数字的单引号去掉
 或者输入48 49 50 51;
#10
Angel乖乖2011-11-12 17:06
可以了。。。谢谢。。。


1