线性表——基本操作

定义线性表结构+初始化

 1 //定义线性表结构
 2 typedef struct
 3 {
 4     int *elem;//存储空间基址
 5     int length;//当前长度
 6     int listsize;//当前分配的存储容量
 7 }Sqlist;
 8 //线性表初始化
 9 int InitList_Sq(Sqlist *L)
10 {
11     L->elem=(int*)malloc(init_list*sizeof(int));//动态开辟一维数组
12     if(!L->elem)
13         exit(OVERALLOCATE);//分配失败检验
14     L->length=0;//空表初始化长度为0
15     L->listsize=init_list;
16     return OK;
17 }

线性表输入内容(注意输入量超过分配空间的扩容函数)

 1 //线性表输入内容
 2 int Input_Sq(Sqlist *L,int n)//输入内容的函数,n为输入数据的个数
 3 {
 4     int *newbase,i;
 5     if(n<0)
 6         return ERROR;
 7     if(n>L->listsize)//输入量超过分配空间
 8     {
 9         newbase=(int*)malloc(listincreament*sizeof(int));
10         if(!newbase)
11             exit(OVERALLOCATE);//查错检验
12         L->elem=newbase;
13         L->listsize+=listincreament;
14     }
15     printf("请输入元素:\n");
16     for(i=0;i<n;i++)
17         {
18             scanf("%d",&L->elem[i]);
19             L->length++;
20         }
21     return OK;
22 }

增(线性表插入元素注意插入很多元素导致之前分配空间不足的重新调整扩容

 1 //线性表插入元素
 2 int listinsert_Sq(Sqlist *L,int i,int e)
 3     {
 4         int *newbase;
 5         int j;
 6         if(i<1||i>L->length+1)//插入位置不在当前长度范围内的查错
 7             return ERROR;
 8         if(L->length>=L->listsize)//插入很多元素导致之前分配空间不足
 9         {
10             newbase=(int*)realloc(L->elem,(L->listsize+listincreament)*sizeof(int));
11             if(!newbase)
12                 exit(OVERALLOCATE);//分配失败差错
13             for(int j=0;j<L->length;j++)
14             {
15                 newbase[j]=L->elem[j];
16             }
17             L->elem=newbase;//新基址
18             L->listsize+=listincreament;//两处更新,重新分配
19         }
20         for(j=L->length-1;j>=i-1;j--)
21         {
22             L->elem[j+1]=L->elem[j];//插入位置之后元素的后移
23         }
24         L->elem[i-1]=e;//插入e
25         ++L->length;//注意表长变化
26         return OK;
27 }

/*注:

realloc函数用来为ptr重新分配大小为size的一块内存

函数形式为:
void * realloc ( void * ptr, size_t new_size );

*/

 1 //线性表删除元素
 2 int listdelete_Sq(Sqlist *L,int i)
 3 {
 4     int e;
 5     int j;
 6     if(i<1||i>L->length)
 7         return ERROR;
 8     e=L->elem[i-1];//将删除元素赋给e
 9     for(j=i-1;j<=L->length-1;j++)
10         {
11             L->elem[j]=L->elem[j+1];//被删除位置之后元素的前移
12         }
13     --L->length;
14     return OK;
15 }

 1 //线性表查找元素函数
 2 int find_Sq(Sqlist *L,int e)
 3 {
 4     int i;
 5     for(i=0;i<L->length;i++)
 6     {
 7         if(L->elem[i]==e)
 8             return i+1;
 9     }
10     return 0;
11 }

线性表输出函数

 1 //线性表输出
 2 int output_Sq(Sqlist*L,int i)
 3 {
 4     int j;
 5     printf("更新后的线性表为:\n");
 6     for(j=0;j<i;j++)
 7     {
 8         printf("%d\t",L->elem[j]);
 9     }
10     return OK;
11 }

主函数测试

 1 //主函数测试    
 2 int main()  
 3 {
 4     Sqlist MY;
 5     char a;
 6     a='Y';
 7     int k;
 8     int data;
 9     int position;
10     int finddata;
11     int b;
12     InitList_Sq(&MY);
13     printf("请输入元素的个数;");
14     scanf("%d",&k);
15     Input_Sq(&MY,k);
16     while(a=='Y')
17     {
18         
19         printf("请输入要删除元素的位置:");
20         scanf("%d",&position);
21         listdelete_Sq(&MY,position);
22         output_Sq(&MY,k-1);
23         
24         printf("\n请输入要插入的元素:\n");
25         scanf("%d",&data);
26         printf("\n请输入要插入的位置\n");
27         scanf("%d",&position);
28         listinsert_Sq(&MY,position,data);
29         output_Sq(&MY,k);
30         
31         printf("\n请输入要查找的元素:");
32         scanf("%d",&finddata);
33         b=find_Sq(&MY,finddata);
34         if(b!=0)
35             printf("位置为:%d",b);
36         else
37             printf("没有这个元素!");
38         
39         printf("\n是否继续?(Y:继续N:结束)\n");
40         getchar();
41         scanf("%c",&a);
42     
43     }
44     return OK;
45 }
46     

 形参为指针,实参传递地址&……;形参为地址,实参传递线性表名称L(即首地址)

猜你喜欢

转载自www.cnblogs.com/YOLO-in-the-sun/p/12810555.html
今日推荐