线性表有两个存储结构,分别为顺序存储和链式存储。
先来说一下顺序存储的一些基本操作
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 }
结果如下图所示: