数据结构之线性表实现(C语言)

1.顺序表的实现

#include <stdio.h>
#include <stdlib.h>


//定义数组最大长度 
#define maxnum 100
//定义元素类型 
typedef int ElementType;
//定义线性表结构 
struct Lnode{
ElementType array[maxnum];
int last;
};
typedef struct Lnode * List;
//建立空表 
List makeEmpty(){
List ptr=(List)malloc (sizeof(struct Lnode));
ptr->last=-1;
return ptr;

//添加元素 
int add(ElementType e,List ptr){
if(ptr->last==maxnum-1){
printf("表已满");
return -1; 
}
ptr->last++;
ptr->array[ptr->last]=e;
}
//查找元素位置 
int find(ElementType e,List ptr){
for(int i=0;i<=ptr->last;i++){
if(e==ptr->array[i])
return i;
}
return -1;
}
//在线性表下表为n的位置插入元素 
void insert(ElementType e,int n,List ptr){
if(ptr->last==maxnum-1){
printf("表已满");
return;
}
if(n<0||n>ptr->last+2){
printf("输入有误");
return; 
}
for(int i=ptr->last+1;i>n;i-- ){
ptr->array[i]=ptr->array[i-1];
}
ptr->array[n]=e;
ptr->last++;

//删除线性表下表元素为n的元素 
void delete(int n,List ptr){
if(n<0||n>ptr->last){
printf("输入有误");
return; 
}
for(int i=n;i<ptr->last;i++){
ptr->array[i]=ptr->array[i+1];

ptr->last--;

}
int main(int argc, char *argv[]) {
List list=makeEmpty();
add(1,list);
insert(2,0,list);
insert(3,0,list);
printf("%d\n",list->last);
printf("%d\n",find(3,list));
for(int i=0;i<=list->last;i++){
printf("%d\t",list->array[i]);
}
system("pause");
return 0;
}

时间复杂度:插入元素的时间复杂度为O(n),按序号查找元素的时间复杂度为O(1),删除元素的时间复杂度为O(n);

2.单向链表的实现

#include <stdio.h>
#include <stdlib.h>


typedef enum{false,true
}bool;
typedef int ElementType; 
typedef struct Lnode * List;
//建立链表节点
struct Lnode{
ElementType data;
struct Lnode * next;
};


//建立空表
List create(){
List list=(List)malloc(sizeof(struct Lnode));
list->next=NULL;
return list;



//求表长
int length(List ptr){
int cnt=0;
while(ptr->next!=NULL){
ptr=ptr->next;
cnt++;
}
return cnt;



//添加元素
void add(ElementType e,List ptr){
List node=(List)malloc(sizeof(struct Lnode));
node->data=e;
node->next=NULL;
while(ptr->next!=NULL){
ptr=ptr->next;
}
ptr->next=node;
}


// 查找元素:按序号查找
ElementType findkth(int k,List ptr){
if(k>length(ptr))
return -1;
for(int i=0;i<k;i++){
ptr=ptr->next;
}
return ptr->data;



//查找元素:按值查找
int find(ElementType e,List ptr){
int j=0;
while(ptr->next!=NULL){
if(e==ptr->data){
return j;
}
j++;
ptr=ptr->next; 
}
return -1;
}


//插入元素:在链表中下表为i的位置插入元素
bool insert(ElementType e,int n,List ptr){
if(n>length(ptr)){
printf("输入有误\n");
return false;
}
for(int i=1;i<n;i++){
ptr=ptr->next;
}
List node=(List)malloc(sizeof(struct Lnode));
node->data=e;
node->next=ptr->next;
ptr->next=node;
return true;



//删除下标为n的节点
bool delete(int n,List ptr){
if(n>length(ptr)){
printf("输入有误");
return false;
}
for(int i=1;i<n;i++){
ptr=ptr->next;
}
List temp=ptr->next;
ptr->next=temp->next;
free(temp);
return true;
}  


//打印链表数据 
void print(List ptr){
while(ptr->next){
ptr=ptr->next;
printf("%d\t",ptr->data);
}



//测试 
int main(int argc, char *argv[]) {
List list=create();
add(1,list);
add(2,list);
add(3,list);
add(4,list);
add(5,list);
add(6,list);
add(7,list);
add(8,list);
add(9,list);
add(10,list);
printf("链表的长度是%d\n",length(list));
print(list);
printf("\n");
printf("%d的位置是第%d\n",5,find(5,list));
printf("第%d位是%d\n",10,findkth(10,list));
insert(20,8,list);
printf("链表的长度是%d\n",length(list));
print(list);
printf("\n");
delete(8,list);
printf("链表的长度是%d\n",length(list));
print(list);
printf("\n");
return 0;
}

    链表进行插入和删除操作时间复杂度位O(1),查询操作的时间复杂度位O(n),所有一般主要进行查询操作用顺序表,经常用到插入或删除操作用链表比较方便。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值