服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现线性表的基本操作详解

C语言实现线性表的基本操作详解

2022-03-06 17:56小柱同学要努力 C/C++

线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列,这篇文章带你学习如何通过C语言实现线性表的顺序存储和链式存储

前言

这里使用的工具是DEV C++

可以借鉴一下

一、实训名称

线性表的基本操作

二、实训目的

1.掌握线性表的基本概念

2.掌握线性表的存储结构(顺序存储与链式存储)

3.掌握线性表的基本操作

三、实训要求

1.线性表可以顺序表也可以用单链表实现,鼓励大家用两种方式实现。

2.创建线性表时,数据从键盘输入整形数据

3.线性表类型定义和或各种操作的实现,可以用教材给出的方法,也可以自己设计。

四、实现效果

C语言实现线性表的基本操作详解

五、顺序存储代码实现

源码

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
#define LISTINCREMENT 10
 
 
typedef struct{
    int *elem;
    int length;
    int listsize;
}sqlist;
 
 void Creatlist(sqlist &L){
    //创建一个线性表
     L.elem=(int *)malloc(MAX*sizeof(int)) ;
     if(!L.elem)return ;
     L.listsize=MAX;
     printf("输入表的长度:");
     scanf("%d",&L.length);
     printf("输入%d的个数:",L.length);
     for(int i=0;i<L.length;i++)
     scanf("%d",&L.elem[i]);
 }
 
 //开始添加取地址符号
 void Traverse(sqlist &L){
    //遍历
     printf("表中数据为:") ;
     for(int i=0;i<L.length;i++)
     printf("%3d",L.elem[i]) ;
     printf("\n");
 }
 
//查找
 void LocateElem(sqlist &L,int e){
     int i;
     printf("输入要查找的元素:\n");
     scanf("%d",&e);
     for(int i=0;i<L.length;i++)
     {
        if(L.elem[i]==e){
            printf("查找成功,查找元素为%d",L.elem[i]);
            printf("\n");
            return ;
         }//if
      } //for
    printf("查找失败!");
     printf("\n");
     
 }//void
 
//确定要删除的元素
 int makesureElem(sqlist &L,int e){
    int i;
    
     for(i=0;i<L.length;i++){
        if(L.elem[i]==e){
            printf("要删除的元素 位置为%d",i+1);
            printf("\n");
            return (i+1);
         }//if
     } //for
     printf("元素不存在!");
     printf("\n");
     
     return 0;
 }
 
 //插入某个元素
 void Listinsert(sqlist &L){
    int i;int e;
    printf("输入要插入位置及元素\n");
    scanf("%d%d",&i,&e);
    printf("在顺序线性表中第%d个位置之前插入新的元素%d。\n",i,e);
    //在顺序线性表L中第i个位置之前插入新的元素e
     if(i<1||i>L.length+1)return;
//   1<=i<=listlength(L)+1;
int *p,*q;
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
 
++L.length;
 
return;
 }
 
 int listdelete(sqlist &L){
    //删除元素
     int i,e;
     printf("输入要删除的元素\n");
     scanf("%d",&e);
     i=makesureElem(L,e);
     if((i<1)||(i>L.length))return 0;
     else{
        int *p,*q;
        p=&(L.elem[i-1]);
        e=*p;
        q=L.elem+L.length-1;
        for(++p;p<=q;++p)*(p-1)=*p;//被删除元素之后的元素左移
         -L.length;
         printf("元素被删除!");
          
     }
      return 0;
 }
 
 
 
int main(){
    sqlist L;
Creatlist(L);
 
    Traverse(L);
    LocateElem(L,1);
    
    Listinsert(L);
    Traverse(L);;
    
    listdelete(L);
    Traverse(L);
    return 0;
}

六、链式存储代码实现

源码

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
struct  danlianbiao_Node{
 
int data;
struct danlianbiao_Node *next;
 
};
 
//base的结构体
 struct  danlianbiao{
 
int length;
struct danlianbiao_Node *base;
 
};
 
  struct danlianbiao *danlianbiao_init();
 void danlianbiao_free(struct danlianbiao *list);
//清除
 void danlianbiao_clear(struct danlianbiao *list);
 int danlianbiao_length(struct danlianbiao *list);
 
//添加
 void danlianbiao_add(struct danlianbiao *list,int index,int value);
 void danlianbiao_remove(struct danlianbiao *list,int index);
 
//修改
 void danlianbiao_set(struct danlianbiao *list,int index,int value);
 int danlianbiao_get(struct danlianbiao *list,int index );
 
 //查询
 int danlianbiao_lookup(struct danlianbiao *list,int value);
int danlianbiao_isempty(struct danlianbiao *list,int value);
 
 
 
void menu()
{
    printf("********目录*******\n");
    printf("输出单链表中的各元素值1\n");
    printf("在单链表中插入数据元素2\n");
    printf("在单链表中插入数据元素3\n");
    printf("寻找单链表中某一个数值4\n");
    printf("结束程序           0\n");
    printf("**********************************\n");
}
 
int main(int argc, char *argv[]) {
    
    int n,m,i,e;
    
  printf("请输入元素的个数 :");
  scanf("%d",&n);
  printf("以此输入%d个数据元素 :",n);
  menu();
  printf("输入你的选择:");
  scanf("%d",&m);
  switch(m)
  {
    
    case 1:
        printf("现在链表的元素为:");
           break;
    case 2:
        printf("依次输入插入位置和数据元素(空格隔开):");
        scanf("%d %d",&i,&e);
        
   }
    return 0;
}
 
 
 
 struct danlianbiao *danlianbiao_init(){
 struct danlianbiao *list=NULL;
 list=( struct danlianbiao *)malloc(sizeof( struct danlianbiao ));
 list->base=(struct danlianbiao_Node *)malloc(sizeof(struct danlianbiao_Node));
 list->base->data=-1;
  list->base->next=NULL;
  list->length=0;
  return list;
 
 }
 
 
  
 void danlianbiao_free(struct danlianbiao *list){
 struct danlianbiao_Node *pnode=NULL;//可能出现问题指针
 while(list->base!=NULL){
    pnode=list->base;
    list->base=pnode->next;
    free(pnode);
    
 }//while
  free(list);
 
 }
 
 
//清除
 void danlianbiao_clear(struct danlianbiao *list){
    
    struct danlianbiao_Node *next=NULL;//可能出现问题指针
    struct danlianbiao_Node *pnode=NULL;
 while(list->base->next!=NULL){
 next=list->base->next;
    list->base->next=next->next;
    free(pnode);
    
 }//while
 list->length=0;
 }
 
//获得单链表的长度
 int danlianbiao_length(struct danlianbiao *list){
    
    
    
 }
 
//添加 ,该函数没有错误
 
 void danlianbiao_add(struct danlianbiao *list,int index,int value){
    int i=0;
    struct danlianbiao_Node *pnode=NULL;
     struct danlianbiao_Node *p=NULL;
     p=(struct danlianbiao_Node *)malloc(sizeof(struct danlianbiao_Node ));
     p->data=value;
     pnode=list->base;
     while(i<index-1&&pnode!=NULL){
        pnode=pnode->next;
         i++;
     }//while
     p->next=pnode->next;
     pnode->next=p;
     list->length++;
    
 }
 //
 //移除这一项没有错误
 
 void danlianbiao_remove(struct danlianbiao *list,int index){
 struct danlianbiao_Node *pnode=NULL;
     struct danlianbiao_Node *p=NULL;
     p=(struct danlianbiao_Node *)malloc(sizeof(struct danlianbiao_Node ));
     //有错误
     int value;int i;
     p->data=value;
     pnode=list->base;
     while(i<index-1&&pnode!=NULL){
        pnode=pnode->next;
         i++; }
         p=pnode->next;
         pnode->next=p->next;
         free(p);
 
 }
  
//设置值 ,这一项没有错误
 
 void danlianbiao_set(struct danlianbiao *list,int index,int value){
        int i=0;
    struct danlianbiao_Node *pnode=NULL;
     struct danlianbiao_Node *p=NULL;
     p=(struct danlianbiao_Node *)malloc(sizeof(struct danlianbiao_Node ));
    
     p->data=value;
     pnode=list->base;
     while(i<index-1&&pnode!=NULL){
        pnode=pnode->next;
         i++;
     }//while
    pnode->data=value;
    
 }
 
 
//得到一个数值函数方法没有错误
 
 int danlianbiao_get(struct danlianbiao *list,int index ){
        int i=0;
        int value;
    struct danlianbiao_Node *pnode=NULL;
     struct danlianbiao_Node *p=NULL;
     p=(struct danlianbiao_Node *)malloc(sizeof(struct danlianbiao_Node ));
    
     p->data=value;
     pnode=list->base;
     while(i<index-1&&pnode!=NULL){
        pnode=pnode->next;
         i++;
     }//while
 return(    pnode->data);
    
    
    
 }
 
 
 //
 
 int danlianbiao_lookup(struct danlianbiao *list,int value){
    
    int i=0;
        struct danlianbiao_Node *pnode=NULL;
        for(pnode=list->base->next;pnode !=NULL;pnode=pnode->next){
            i++;
            if(pnode->data==value) {
                return i;
             }//if
         }//for
    return 0;
 }
 
int danlianbiao_isempty(struct danlianbiao *list,int value){
}<font face="Arial, Verdana, sans-serif"><span style="white-space: normal;"> </span></font>

到此这篇关于C语言实现线性表的基本操作详解的文章就介绍到这了,更多相关C语言 线性表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43304253/article/details/121539680

延伸 · 阅读

精彩推荐