Chinaunix首页 | 论坛 | 博客
  • 博客访问: 768293
  • 博文数量: 199
  • 博客积分: 3584
  • 博客等级: 中校
  • 技术积分: 2193
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 21:18
文章分类

全部博文(199)

文章存档

2018年(6)

2013年(14)

2012年(30)

2011年(28)

2010年(24)

2009年(86)

2008年(11)

分类: C/C++

2011-10-19 15:46:21

原创代码,转载需注明。

题目描述:

请你定义一个链表,可以对链表进行“在某个元素之前插入一些元素”、“删除某个位置的元素”、“查找某元素”、“获取某个位置的元素”、“遍历输出所有元素”、“求链表的长度”等操作。键盘输入一些命令,可以执行上述操作。本题中,链表元素为整数,链表的第一个元素位置为 1,链表的最大长度为20。

--------------------------------------------------------------------------------

输入样例:


I
2
1 1
2 2
S 2
D 1
I
2
1 3
2 4
G 2
L
V
E

--------------------------------------------------------------------------------

输出样例:


2
1
4
3
3
4
2

--------------------------------------------------------------------------------

输入描述:

各个命令以及相关数据的输入格式如下:
在某个位置之前插入操作的命令:I,接下来的一行是插入的组数n,下面是n行数据,每行数据有两个值,分别代表插入位置与插入的元素值
查找某个元素:S x,x是要查找的元素值
获取某个位置的元素:G i,i是需要获取的元素位置
删除某个位置的元素:D i,i是被删除的元素位置
求链表的长度:L
遍历输出所有元素:V
当输入的命令为E时,程序结束。

--------------------------------------------------------------------------------

输出描述:

当输入的命令为S时,输出要查找元素的位置,如果没找到,输出None
当输入的命令为G时,输出获取的元素值,如果输入的元素位置不正确,输出“位置不正确”
当输入的命令是D时,输出被删除的那个元素值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”
当输入命令是I时,如果输入的位置不正确,输出“位置不正确”
当输入的命令是L时,输出链表的长度
注意,所有的元素均占一行。

--------------------------------------------------------------------------------

程序限制:

程序可使用最大内存:10000K
程序运行最长耗时:10000MS(毫秒)

------------------------------------------------------------------------------------

时间没测试。
  1. /*
  2.  *CopyRight@sh365
  3.  */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. #define MAX_NODE 1024

  8. typedef struct _NODE{
  9.     int val;
  10.     struct _NODE *pNext;
  11. }NODE;

  12. int creatLink(NODE **header)
  13. {
  14.     *header = (NODE *)malloc(sizeof(NODE));
  15.     
  16.     if (NULL == *header) {
  17.         return -1;
  18.     } else {
  19.         (*header)->val = 0; /*header's val will be used for count the node numbers*/
  20.     (*header)->pNext = NULL;
  21.         return 0;
  22.     }
  23. }

  24. int insertNode(NODE *header, int position, int val)
  25. {
  26.     NODE *p = NULL;
  27.     NODE *h = header;
  28.     int i = 0;

  29.     if (position > (header->val + 1)) {
  30.     return -1;
  31.     }
  32.     
  33.     p = (NODE *)malloc(sizeof(NODE));
  34.     if (NULL == p) {
  35.     return -1;
  36.     }
  37.     
  38.     p->val = val;
  39.     p->pNext = NULL;
  40.     
  41.     for (i=1; i<position; i++) {
  42.         h = h->pNext;
  43.     }
  44.     p->pNext = h->pNext;
  45.     h->pNext = p;
  46.     header->val += 1;
  47.     
  48.     return 0;
  49. }

  50. int deleteNode(NODE *header, int position)
  51. {
  52.     NODE *p = NULL;
  53.     NODE *h = header;
  54.     int i = 0;

  55.     if (position > (header->val + 1)) {
  56.     return -1;
  57.     }
  58.     
  59.     for (i=1; i<position; i++) {
  60.         h = h->pNext;
  61.     }
  62.     p = h->pNext;
  63.     h->pNext = p->pNext;
  64.     free(p);
  65.     p = NULL;
  66.     header->val -= 1;
  67.     
  68.     return 0;

  69. }

  70. int searchNode(NODE *header, int val)
  71. {
  72.     NODE *h = header->pNext;
  73.     int i = 0;

  74.     for (i=0; i<header->val; i++) {
  75.         if (h->val == val) {
  76.         fprintf(stderr, "%d\n", i+1);
  77.     }
  78.     h = h->pNext;
  79.     }
  80.     
  81.     return 0;
  82. }

  83. int getNode(NODE *header, int position)
  84. {
  85.     NODE *h = header;
  86.     int i = 0;

  87.     if (position > header->val) {
  88.     return -1;
  89.     }
  90.     
  91.     for (i=0; i<position; i++) {
  92.         h = h->pNext;
  93.     }
  94.     fprintf(stderr, "%d\n", h->val);
  95.     
  96.     return 0;


  97. }

  98. int ergodiLink(NODE *header)
  99. {
  100.     NODE *h = header->pNext;
  101.     int i = 0;

  102.     for (i=1; i<=header->val; i++) {
  103.         fprintf(stderr, "%d %d\n", i, h->val);
  104.     h = h->pNext;
  105.     }

  106.     return 0;
  107. }

  108. int getLinkLen(NODE *header)
  109. {
  110.     return header->val;
  111. }

  112. int deleteLink(NODE *header)
  113. {
  114. /*delete the link and free the node space*/
  115.     return 0;
  116. }

  117. /*
  118.  *CopyRight-@sh365
  119.  */
  120. #define N 128
  121. int main(int argc, char *argv[])
  122. {
  123.     NODE *header = NULL;
  124.     int ret = 0;
  125.     int cnt = 0;
  126.     int val1 = 0;
  127.     int val2 = 0;
  128.     int quit = 0;
  129.     char comd_data[N+1];
  130.     
  131.     ret = creatLink(&header);
  132.     if (-1 == ret) {
  133.         fprintf(stderr, "createLink error, exit\n");
  134.         exit(-1);
  135.     }

  136.     quit = 0;
  137.     while (!quit) {
  138.     fflush(stdin);
  139.     fgets(comd_data, N, stdin);
  140.     comd_data[N] = '\0';
  141.         
  142.         switch(comd_data[0]){
  143.             case 'i':
  144.             case 'I':
  145.         fscanf(stdin, "%d", &cnt);
  146.         while (cnt-- > 0) {
  147.             fflush(stdin);
  148.                     fscanf(stdin, "%d %d", &val1, &val2);
  149.             ret = insertNode(header, val1, val2);
  150.             if (-1 == ret) {
  151.                 fprintf(stderr, "Insert Node to link error. out ot memery or illegal position.\n");
  152.             }
  153.         }
  154.         fgets(comd_data, N, stdin);/* delete the last \n*/
  155.                 break;

  156.             case 's':
  157.             case 'S':
  158.         ret = searchNode(header, atoi(comd_data+2));
  159.                 break;

  160.             case 'g':
  161.             case 'G':
  162.             ret = getNode(header, atoi(comd_data+2));
  163.                 break;

  164.             case 'd':
  165.             case 'D':
  166.             ret = deleteNode(header, atoi(comd_data+2));
  167.                 break;

  168.             case 'l':
  169.             case 'L':
  170.                 fprintf(stderr, "%d\n", getLinkLen(header));
  171.                 break;

  172.             case 'v':
  173.             case 'V':
  174.                 ret = ergodiLink(header);
  175.                 if (-1 == ret) {
  176.                     fprintf(stderr, "view the link error.\n");
  177.                 }
  178.                 break;

  179.             case 'q':
  180.         case 'Q':
  181.             ret = deleteLink(header);
  182.             quit = 1;
  183.         break;

  184.         default:
  185.         break;
  186.         }
  187.     }
  188.     
  189.     printf("End of main()\n");
  190.     return 0;
  191. }

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