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),所有一般主要进行查询操作用顺序表,经常用到插入或删除操作用链表比较方便。