C语言——数据结构线性表

线性表

线性表的类型定义

线性表的定义

线性表的创建

线性链表的创建

线性链表节点的删除

线性表的类型定义

线性表是常用且最简单的一种数据结构。简言之一个线性表是n个数据元素的有限序列。至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数一个符号也可以是一页书,甚至是其他更复杂的信息。

 

线性表的定义

typedef struct SeqList{

 char* array; //动态从堆上申请

 int capacity; //容量

 int size; //有效数据的个数 尾插时,可用位置的下标

}SeqList;

1

2

3

4

5

其中的char类型类似于结构体,可以因题而异,还可以增加其他类型的定义等。

线性表一般的为顺序储存结构,还会有链式储存结构,如下:

 

struct array 

{

 int number;

};  

typedef struct list{ //链表用来存储从文件中都出来的数据 

 array arrays;

 struct list *next;

}set, *last;

1

2

3

4

5

6

7

8

线性表的创建

该线性表的创建是以字符串的输入来创建。

 

void setSepList(SeqList *Listname){//输入并整理滤去其他字符,并赋值给最终顺序表 

 //大小可以自己确定30可以自己进行更改。

 Listname->array = (char*)malloc(sizeof(30));//申请空间大小

 Listname->capacity = 30;

 char s[100] , temp[100];

 int por[200]; 

 scanf("%s", &s);

 int i = 0 , x = 0;

 i = 0;

 for(int l = 'a'; l <='z';l++){//排除第二次进入第一次进入改变值的干扰。 

  por[l] == 0; 

 }

 i = 0;

 while(s[i]!=NULL){//遍历数组 

  if(s[i] >='a' && s[i] <='z' && por[s[i]] != 1){//排除a-z以外的字符并排除多次出现的字符。 

   temp[x] = s[i];

   por[s[i]] = 1;

   x++;

  }

  i++;

 }

 i = 0;

 while(temp[i]!=NULL){//将放置在临时字符组的字符转移到目标顺序表中 

  Listname->array[i] = temp[i];

  i++;

 }

 //Listname->array = temp;

 Listname->size = i;

 printf("整理后数组中的元素为:[%c", Listname->array[0]);//输出 

 for(int f = 1; f < x; f++ ){

  printf(",%c",Listname->array[f]);

 }

 printf("]\n");

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

该串代码仅取26位英文字母,其他的数字以及字符均被排除。请谨慎取用,排除是由C语言中的ASSCII码的大小来排除,在其他的地方是不适用的。

 

线性链表的创建

该线性链表的创建是用头插法来建立的,除此之外还有尾插法此处不进行过多介绍。

 

last createheadlist(){//头插法建立链表 

 char temp[100], temp1[100];

 int x = 0, i = 0, nu;

 printf("请输入你想创建的链表中元素的个数。\n");

 scanf("%d", &nu);

 last n , p, head;

 head = (last)malloc(sizeof(set));

 head->next = NULL;

 n = (last)malloc(sizeof(set));

 n->next = head;

 i = 0;

 printf("请按照非递增输入\n");

 while(i < nu){

  int temp;

  printf("请输入第%d个元素\n",i+1);

  scanf("%d", &temp);

  last m = (last)malloc(sizeof(set));

  m->arrays.number = temp;

  m->next = n;

  n = m;

  i++;

 }

 head->next = n;

 p = head->next;

 while(p->next->next!=head){

  p = p->next;

 }

 p->next = head;

 return head;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

线性链表节点的删除

线性链表节点的删除需要节点的位置,所以需要两个参数才能删除线性链表的节点。

 

last deletelist(last head, int number){//删除该位置节点 

 last p;

 int i = 0;

 p = head;

 while(i < number){

  p = p->next;

  i++;

 }

 p->next = p->next->next;

 return head;

}

1

2

3

4

5

6

7

8

9

10

11

线性表还有许多其他的操作以及其他例子,这里我的学识有限就不多做介绍了。

如果大家有其他疑问欢迎提出来,C语言的数据结构其他知识我会继续更新的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值