线性表实现——静态链表

  1 /*静态链表*/
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <time.h>
  5 
  6 #define OK 1
  7 #define ERROR 0
  8 #define MAXSIZE 1000
  9 typedef int ElemType;
 10 typedef int Status;
 11 
 12 typedef struct 
 13 {
 14     ElemType data;
 15     int cur;
 16 }Component,StaticLinkList[MAXSIZE];
 17 
 18 
 19 Status InitList(StaticLinkList space)  //初始化操作
 20 {
 21     int i;
 22     for (i = 0; i < MAXSIZE; i++)
 23     {
 24         space[i].cur = i + 1;
 25     }
 26     space[MAXSIZE - 1].cur = 0;
 27     return OK;
 28 }
 29 int Malloc_SLL(StaticLinkList space)
 30 {
 31     int i = space[0].cur;
 32     if (space[0].cur)
 33         space[0].cur = space[i].cur;
 34     return i;
 35 }
 36 
 37 int ListLength(StaticLinkList L)
 38 {
 39     int j = 0;
 40     int i = L[MAXSIZE - 1].cur;
 41     while (i)
 42     {
 43         i = L[i].cur;
 44         j++;
 45     }
 46     return j;
 47 }
 48 
 49 void Free_SSL(StaticLinkList L, int k)  //清空线性表
 50 {
 51     L[k].cur = L[0].cur;
 52     L[0].cur = k;
 53 }
 54 
 55 Status ListInsert(StaticLinkList L, int i, ElemType e) //在线性表L的第i个位置插入元素e
 56 {
 57     int j, k, l;
 58     k = MAXSIZE - 1;
 59     if (i<1 || i>ListLength(L)+1)
 60         return ERROR;
 61     j = Malloc_SLL(L);
 62     if (j)
 63     {
 64         for (l = 1; l <= i-1; l++)
 65         {
 66             k = L[k].cur;
 67         }
 68         L[j].data = e;
 69         L[j].cur = L[k].cur;
 70         L[k].cur = j;
 71         return OK;
 72     }
 73     return ERROR;
 74 }
 75 
 76 Status ListDelete(StaticLinkList L, int i, ElemType* e)//删除线性表L中第i个位置元素,并用e返回其值
 77 {
 78     int j, k;
 79     k = MAXSIZE - 1;
 80     if (i<1 || i>ListLength(L) + 1)
 81         return ERROR;
 82 
 83     for (j = 1; j <= i; j++)
 84     {
 85         k = L[k].cur;
 86     }
 87     j = L[k].cur;
 88     L[k].cur = L[j].cur;
 89     Free_SSL(L, j);
 90     return OK;
 91 }
 92 
 93 void visit(ElemType n)
 94 {
 95     printf("%d ", n);
 96 }
 97 
 98 void ListTraverse(StaticLinkList L)
 99 {
100     int i = L[MAXSIZE - 1].cur;
101     while (i)
102     {
103         visit(L[i].data);
104         i = L[i].cur;    
105     }
106 }
107 int main()
108 {
109     StaticLinkList L;
110     int i = 0;
111     int opp = 0;
112     int pos;
113     int j;
114     ElemType e;
115     i = InitList(L);
116     printf("链表L初始化完毕,ListLength(L)=%d\n\n", ListLength(L));
117 
118     printf("\n1.遍历操作 \n2.插入操作  \n3.删除操作 \n0.退出 \n请选择你的操作:\n");
119 
120     while (opp != '0') {
121         scanf_s("%c", &opp);
122         switch (opp) {
123         case '1':
124             ListTraverse(L);
125             printf("\n");
126             break;
127 
128         case '2':
129             srand((unsigned)time(NULL));
130             for (j = 1; j <= 10; j++)
131             {
132                 i = ListInsert(L, j, rand() % 100);
133             }
134             printf("在L的表头依次插入10个随机数后:");
135             ListTraverse(L);
136             printf("\n");
137             printf("链表L创建完毕,ListLength(L)=%d\n\n", ListLength(L));
138             break;
139         case '3':
140             printf("要删除第几个元素?");
141             scanf_s("%d", &pos);
142             ListDelete(L, pos, &e);
143             printf("删除第%d个元素成功,现在链表为:\n", pos);
144             ListTraverse(L);
145             printf("\n");
146             break;
147 
148         case '0':
149             exit(0);
150         }
151     }
152 }

 

posted @ 2016-09-18 17:32  沙加的孩子  阅读(147)  评论(0编辑  收藏  举报