Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4825889
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: C/C++

2008-10-30 20:29:49

学ds,哦不对,确切的说是温习ds,可是以前学的早以丢到九霄云外^_^.也可以算是学习ds了.零零碎碎的学了点,有时间的时候不想整这个,想的时候没时间,套用个话,爱的不够借口就多多^_^
上午shell,下午自由,晚上ds,dota,movie不错不错^_^
   小弟不才下面是自己写的个链表程序,还望各位赐教.
#include <stdio.h>
#include <stdlib.h>

typedef struct Lnode
{
  char data;
  struct Lnode *next;
} Lnode, *LinkList;

Lnode *
create (void)
{
  Lnode *pnode;
  pnode = (Lnode *) malloc (sizeof (Lnode));
  pnode->next = NULL;
  return pnode;
}

void
init (Lnode* phead)
{
  Lnode* p = phead;
  Lnode* s;
  int i=10;
  printf("-------开始初始元素--------\n");
  while(i--)
    {
      s = (Lnode *) malloc (sizeof (Lnode));
      if(s == NULL)
    perror("malloc error");
      printf("请输入第%d个初始元素\n",i);
      scanf ("%c", &s->data);
      getchar();
      s->next = p->next;
      p->next = s;
    }
   printf("-------初始元素结束--------\n");
}

void
del (Lnode * p, int x)        //删除位置为X的元素(from 1)

{
  int i = 0;
  char e;
  Lnode *q = p;
  Lnode *t;
  while (q->next != NULL && i < x-1)
    {
      i++;
      q = q->next;        //q指向要删除的位置前一个元素

    }
  if (!(q->next) || i > x-1)
    printf ("未找到指定位置!\n");
  else
   {
      t = q->next;
      e = t->data;
      q->next = t->next;
      free (t);
      printf ("删除成功第%d个元素%c!\n",x,e);
    }
}

void
get (Lnode * p, int x)        //取出位置为X的元素(from 1)

{
  int i = 0;
  char e;
  Lnode *q = p;
  while (q->next != NULL && i < x-1)
    {
      i++;
      q = q->next;        //q指向要取出的位置前一个元素

    }
  if (!(q->next) || i > x-1)
    printf ("未找到指定位置!\n");
  else
   {
      e = q->next->data;
      printf ("第%d个元素为%c!\n",x,e);
    }
}

void
insert (Lnode * p, int x, char c)    //在位置X之前插入元素C,就是插入后要插入的元素位置为x

{
  int i = 0;
  Lnode *q = p;
  Lnode *t;
  while (q && i < x-1)
    {
      i++;
      q = q->next;
    }
 if(q && (i == x-1))
  {
    t = (Lnode *) malloc (sizeof (Lnode));
    t->data = c;
    t->next = q->next;
    q->next = t;
    printf ("插入成功!\n");
  }
}

void
show (Lnode * q)
{
  Lnode *temp = q->next;
  int i = 1;
  while (temp != NULL)
    {
      printf ("%d->", i);
      temp = temp->next;
      i++;
    }
  printf ("NULL\n");
  temp = q->next;
  while (temp != NULL)
    {
      printf ("%c->", temp->data);
      temp = temp->next;
    }
  printf ("NULL\n");
}

Lnode *
reverse (Lnode * head)
{
  Lnode *q = head->next->next;
  Lnode *temp;
  Lnode *r;
  if (head->next == NULL || q == NULL)
    {
      printf ("逆置成功!\n");
      return head;
    }
  head->next->next = NULL;
  while (q != NULL)
    {
      r = head->next;
      head->next = q;
      temp = q->next;
      q->next = r;
      q = temp;
    }
  printf ("逆置成功!\n");
  return head;
}

void
quit (Lnode * head)
{
  Lnode *p = head->next;
  Lnode *q;
  while (p != NULL)
    {
      q = p;
      p = p->next;
      free (q);
    }
}

void
help ()
{
  printf
    ("0 帮助信息 1 插入元素 2 删除元素 3 逆置链表 4 显示链表 5 取元素 6 退出\n");
}

void
main ()
{
  int pos, cmd;
  char ch;
  Lnode *phead = create ();
  init (phead);
  help();
  scanf ("%d", &cmd);
  while (1)
    {
      switch (cmd)
    {
    case 1:
     printf
     ("请依次输入要插入的元素位置及元素的值:\n(如果输入位置越界,则插入到链表尾部)");
     scanf ("%d%s", &pos, &ch);
     //printf("pos=%d,ch=%c",pos,ch);

     insert (phead, pos, ch);
     scanf ("%d", &cmd);
     break;
    case 2:
     printf ("请依次输入要删除的元素位置:");
     scanf ("%d", &pos);
      //printf("pos=%d",pos);

     del (phead, pos);
     scanf ("%d", &cmd);
     break;
    case 3:
     phead = reverse (phead);
     scanf ("%d", &cmd);
     break;
    case 0:
     help ();
     scanf ("%d", &cmd);
     break;
    case 4:
     show (phead);
     scanf ("%d", &cmd);
     break;
    case 5:
     printf ("请依次输入要查找的元素位置:");
     scanf ("%d", &pos);
     get (phead,pos);
     scanf ("%d", &cmd);
     break;
    case 6:
     quit (phead);
     goto exit;
    default:
     printf ("请输入正确的命令!\n");
     scanf ("%d", &cmd);
     break;
    }
    }
exit:
  printf ("链表空间已经释放,再见!\n");
}

zj@zj:~/C_pram/practice$ ./link_list
-------开始初始元素--------
请输入第9个初始元素
a
请输入第8个初始元素
b
请输入第7个初始元素
c
请输入第6个初始元素
d
请输入第5个初始元素
e
请输入第4个初始元素
f
请输入第3个初始元素
g
请输入第2个初始元素
h
请输入第1个初始元素
i
请输入第0个初始元素
j
-------初始元素结束--------
0 帮助信息 1 插入元素 2 删除元素 3 逆置链表 4 显示链表 5 取元素 6 退出
4
1->2->3->4->5->6->7->8->9->10->NULL
j->i->h->g->f->e->d->c->b->a->NULL
3

1
请依次输入要插入的元素位置及元素的值:
(如果输入位置越界,则插入到链表尾部)1q

4
1->2->3->4->5->6->7->8->9->10->11->NULL
q->a->b->c->d->e->f->g->h->i->j->NULL
2
请依次输入要删除的元素位置:1

5
请依次输入要查找的元素位置:3

6
链表空间已经释放,

阅读(2394) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~