线性表的基本操作

线性表有两个存储结构,分别为顺序存储和链式存储。

先来说一下顺序存储的一些基本操作

 1 //顺序表的初始化
 2 int InitList(Node *L){
 3     L->slist=(Elemtype *)malloc(INIT_SIZE*sizeof(Elemtype));
 4     if(!L->slist) return ERROR;
 5     L->length=0;
 6     L->listsize=INIT_SIZE;
 7     return OK;
 8 }
 9 //插入数据
10 int ListInsert(Node *L,int i,Elemtype e){
11     int k;
12     if(i<1||i>L->length+1) return ERROR;
13     if(L->length>=L->listsize){
14         L->slist=(Elemtype *)realloc(L->slist,(INIT_SIZE+INCREM)*sizeof(Elemtype));
15         if(!L->slist) return ERROR;
16     }
17     for(k=L->length;k>i-1;k--)
18         L->slist[k]=L->slist[k-1];
19     L->slist[k]=e;
20     L->length++;
21     return OK;
22 }
23 //删除数据
24 int ListDelete(Node *L,int i,Elemtype *e){
25 
26     Elemtype *p;
27     if(i<1||i>L->length) return ERROR;
28     if(L->length==0) return ERROR;
29     p=L->slist+i;
30     *e=*(p-1);
31     for(;p<L->slist+L->length;p++){
32         *(p-1)=*p;
33     }
34     L->length--;
35     return OK;
36 }
37 //遍历顺序表
38 int ListTraverse(Node *L){
39     int i;
40     for(i=0;i<L->length;i++){
41         printf("%d",L->slist[i]);
42     }
43     return OK;
44 }

完整代码以及运算结果如下图所示

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 typedef int Elemtype;
 4 #define INIT_SIZE 50
 5 #define INCREM 10
 6 #define OK 1
 7 #define ERROR 0
 8 typedef struct Node{
 9     Elemtype *slist;
10     int length;
11     int listsize;
12 }Node;
13 //顺序表的初始化
14 int InitList(Node *L){
15     L->slist=(Elemtype *)malloc(INIT_SIZE*sizeof(Elemtype));
16     if(!L->slist) return ERROR;
17     L->length=0;
18     L->listsize=INIT_SIZE;
19     return OK;
20 }
21 //插入数据
22 int ListInsert(Node *L,int i,Elemtype e){
23     int k;
24     if(i<1||i>L->length+1) return ERROR;
25     if(L->length>=L->listsize){
26         L->slist=(Elemtype *)realloc(L->slist,(INIT_SIZE+INCREM)*sizeof(Elemtype));
27         if(!L->slist) return ERROR;
28     }
29     for(k=L->length;k>i-1;k--)
30         L->slist[k]=L->slist[k-1];
31     L->slist[k]=e;
32     L->length++;
33     return OK;
34 }
35 //删除数据
36 int ListDelete(Node *L,int i,Elemtype *e){
37 
38     Elemtype *p;
39     if(i<1||i>L->length) return ERROR;
40     if(L->length==0) return ERROR;
41     p=L->slist+i;
42     *e=*(p-1);
43     for(;p<L->slist+L->length;p++){
44         *(p-1)=*p;
45     }
46     L->length--;
47     return OK;
48 }
49 //遍历顺序表
50 int ListTraverse(Node *L){
51     int i;
52     for(i=0;i<L->length;i++){
53         printf("%d",L->slist[i]);
54     }
55     return OK;
56 }
57 int main()
58 {
59     int m,n,i;
60     Node a;
61     InitList(&a);
62     while(1){
63     printf("请输入要向第几个位置插入元素:");
64     scanf("%d",&m);
65     printf("请输入插入的元素的值:");
66     scanf("%d",&n);
67     ListInsert(&a,m,n);
68     printf("是否停止输入并且输出顺序表中元素的值1:是/0:不是:");
69     scanf("%d",&i);
70     if(i) {ListTraverse(&a); break;}
71     else continue;
72     }
73 
74     return 0;
75 }

运行结果如图所示

线性表的基本操作

 

 

链表的基本操作

完整代码为:

  1 #define OK 1
  2 #define ERROR 0
  3 typedef struct List
  4 {
  5     int data;
  6     struct List *next;
  7 } List;
  8 //初始化链表
  9 int createList(List *list)
 10 {
 11     list->next=(List *)malloc(sizeof(List));
 12     if(!list->next)
 13         return ERROR;
 14     list->next=NULL;
 15     return OK;
 16 }
 17 //创建结点
 18 List *createNode(int data)
 19 {
 20     List *newNode=(List *)malloc(sizeof(List));
 21     newNode->data=data;
 22     newNode->next=NULL;
 23     return newNode;
 24 }
 25 //插入结点
 26 void InsertNode(List *list,int i,int data)
 27 {
 28     int k;
 29     List *p=list;
 30     List *newNode=createNode(data);
 31     for(k=1; k<=i-1; k++)
 32     {
 33         p=p->next;
 34     }
 35     newNode->next=p->next;
 36     p->next=newNode;
 37 
 38 }
 39 //删除结点
 40 int DeleteNode(List *list,int i)
 41 {
 42     int m,n;
 43     List *p=list,*q=list;
 44     for(m=1; m<=i-1; m++)
 45     {
 46         p=p->next;
 47     }
 48     for(n=1; n<=i; n++)
 49     {
 50         q=q->next;
 51     }
 52 
 53     p->next=q->next;
 54     return OK;
 55 }
 56 //遍历结点
 57 void printNode(List *p)
 58 {
 59     List *m=p->next;
 60     while(m)
 61     {
 62         printf("%d",m->data);
 63         m=m->next;
 64     }
 65 }
 66 int main()
 67 {
 68     int m,n,i,k,q,r;
 69 
 70     List a;
 71     createList(&a);
 72     while(1)
 73     {
 74         printf("请输入在第几个位置插入数据:");
 75         scanf("%d",&m);
 76         printf("请输入插入的数据的值:");
 77         scanf("%d",&n);
 78         InsertNode(&a,m,n);
 79         printf("是否继续插入1:是/0:不是");
 80         scanf("%d",&i);
 81         if(i)
 82             continue;
 83         else
 84         {
 85             while(1)
 86             {
 87                 printf("是否要删除数据:是:1/不是:0");
 88                 scanf("%d",&k);
 89                 if(k)
 90                 {
 91                     printf("请输入删除第几个位置的数据");
 92                     scanf("%d",&q);
 93                     DeleteNode(&a,q);
 94                 }
 95                 printf("是否继续删除:1:是/0:不是");
 96                 scanf("%d",&r);
 97                 if(r)
 98                     continue;
 99                 else
100                     break;
101 
102             }
103             printNode(&a);
104             return 0;
105         }
106     }
107 }

结果如下图所示:

线性表的基本操作

 

上一篇:STL源码分析 -sList


下一篇:删除链表元素