c语言顺序表的创建程序

Python013

c语言顺序表的创建程序,第1张

/*

 *程序不足之处:1,main函数不应该为 void main

 *                        2,创建空的顺序表函数中 SqList L//定义顺序表L L是局部变量,

函数结束即销毁,应该用指针代替

 *                        3,SqList CreateList(SqList L)  //创建顺序表(非空)函数中:

scanf("%d",&L.elem)L里面的elem本来就是地址,

没必要 再加&符号,且每次输入都一直放在首地址,

    没达到程序所要表达的意思

 *                        4,void print(SqList L)  //输出当前顺序表 函数中:

printf("%-3d",L.elem)和上面是一样的道理

 *                        5,main函数中没有将申请的内存释放

 *现将程序稍作修改如下,望采纳

 */

#include<stdio.h>

#include<stdlib.h>

#define LIST_INIT_SIZE 100

#define Icreament 20

typedef int ElemType  //用户自定义数据元素类型

typedef struct

          ElemType *elem  //顺序表的基地址 

          int length  //顺序表的当前长度 

          int listsize  //预设空间容量

}SqList  //线性表的顺序存储结构

SqList* InitList()  //创建空的顺序表

           SqList* L = (SqList*)malloc(sizeof(SqList))//定义顺序表L

          if(!L)

         {

              printf("空间划分失败,程序退出\n")  

              return NULL 

        }

       L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)) 

        if(!L->elem)

       {  

             printf("空间划分失败,程序退出\n")  

             return NULL 

      } 

       L->length=0 

        L->listsize=LIST_INIT_SIZE 

       return L

}

int CreateList(SqList* L)  //创建顺序表(非空)

          int number  //顺序表中元素的个数 

           int i  //循环变量 

            printf("请输入顺序表中元素的个数:") 

            scanf("%d",&number)

            if(number >LIST_INIT_SIZE)   //一定要判断输入的个数是否大于顺序表的最大长度

            {

                    printf("输入个数大于顺序表的长度\n")

                  return 0

             }

 for(i=0i<numberi++) 

        { 

               printf("输入第%d个数: ",i+1) 

               scanf("%d",L->elem+i)   //L->elem+i:每次的输入都保存在顺序表元素中的下一个地址,而不是一直放在元素的首地址

         }//给顺序表中每个数据元素赋值

        L->length=number  //当前顺序表的长度 

       return 1

}

void print(SqList* L)  //输出当前顺序表

{

          int i 

          for(i=0i<L->lengthi++)

         {

               printf("%-3d",*(L->elem + i)) //L->elem+i:和输入是一个道理

         } 

          printf("\n")

}

int main()

           SqList* L = InitList()  //申请一个指向顺序表的指针,并对其初始化

           if(!L)      //判断申请是否成功

          {

                printf("初始化线性表失败\n")

                return 1

           }

          if(!CreateList(L))   //判断创建顺序表是否成功

         {

               printf("创建顺序表失败\n")

             return 1

         }

            print(L)     //打印顺序表

         free(L->elem)    //释放申请的顺序表元素的内存

        free(L)     //释放申请的顺序表内存

          return 0

}

运行效果如图:

#include <stdio.h>

#include <malloc.h>

typedef struct nlist

{

    int *np

    int len//已使用地址个数

    int maxlen//最大地址个数

}NLT

NLT *createlist()//创建顺序表

int addtolist(NLT *nlist)//向顺序表插入元素

void pList(NLT *nlist)//遍历顺序表

int main()

{

    int i

    NLT *nlist=createlist()

    if(nlist)

    {

        for(i=0i<nlist->maxleni++)

            addtolist(nlist)

        pList(nlist)

    }

    return 0

}

void pList(NLT *nlist)//遍历打印,空格分割,最后一个数后面没有空格

{

    int i

    for(i=0i<nlist->len-1i++)

        printf("%d ",nlist->np[i])

    printf("%d",nlist->np[nlist->len-1])

}

NLT *createlist()

{

    NLT *nlist=NULL

    nlist=(NLT *)malloc(sizeof(NLT))

    scanf("%d",&nlist->maxlen)

    nlist->np=(int *)malloc(sizeof(int)*nlist->maxlen)

    if(!nlist || !nlist->np)

    {

        printf("内存申请失败!\n")

        return NULL

    }

    nlist->len=0

    return nlist

}

int addtolist(NLT *nlist)

{

    if(nlist->len<nlist->maxlen)//如果存储空间未满,保存元素,保存成功返回1 失败返回0

    {

        scanf("%d",&nlist->np[nlist->len])

        nlist->len++

        return 1

    }

    else //这里可以写当存储满的之后,空间扩容,本题用不到所以我不写了

        return 0

}

/*

GY52122008

请输入插入字符 : -

请输入插入位置 : 7

GY5212-2008

Press any key to continue

*/

#include <malloc.h>

#include <stdio.h>

#include <string.h>

#define maxsize 100

typedef struct {

char *data

int length

}sqlist

void initlist(sqlist *&L) { //初始化顺序表

L = (sqlist *)malloc(sizeof(sqlist))

L->data = (char *)malloc(maxsize)

L->length = 0

}

void createlist(sqlist *&L,char a[],int n) { //建立顺序表

int i

for(i = 0i < ni++) L->data[i] = a[i]

L->length = n

}

bool listinsert(sqlist *&L,int i,char e) { //插入数据元素

int j

if(i < 1 || i > L->length + 1) return false

i--

for(j = L->lengthj > ij--) L->data[j] = L->data[j - 1]

L->data[i] = e

L->length++

return true

}

bool listdelete(sqlist *&L,int i,char &e) { //删除数据元素

int j

if(i < 1 || i> L->length) return false

i--

e = L->data[i]

for(j = 1j < L->length - 1j++) L->data[j] = L->data[j + 1]

L->length--

return true

}

int listlength(sqlist *L) { //求线性表长度

return(L->length)

}

void destroylist(sqlist *&L) {

free(L)

}

int locateelem(sqlist *L,char e) { //按元素查找

int i = 0

while(i < L->length && L->data[i] != e) i++

if(i >= L->length) return 0

else return i + 1

}

void displist(sqlist *L) {  //输出线性表

int i

for(i = 0i < L->lengthi++) printf("%c",L->data[i])

printf("\n")

}

int main() {

int pos,len

char ch,data[50] = "GY52122008"

sqlist *L

initlist(L) // 先初始化

len = strlen(data)

createlist(L,data,len) // 创建表

displist(L)

printf("请输入插入字符 : ")

scanf("%c",&ch)

printf("请输入插入位置 : ")

scanf("%d",&pos)

if(listinsert(L,pos,ch)) displist(L)

else printf("插入操作失败。\n")

free(L->data)

free(L)

return 0

}