数组实现
1.线性表的初始化
2.线性表的元素添加
3.线性表的插入
4.线性表判断是否为空
5.线性表判断是否为满
6.线性表的删除
7.线性表的扩容
8.线性表的遍历
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
#define MAXSIZE 5 //初始容量
typedef struct node{
int *data;//数组链表
int cnt;//链表中元素的数量
int capacity;//容量
}NODE;
void init(NODE*list){//初始化
list->capacity=MAXSIZE;
list->data=(int*)malloc(sizeof(int)*list->capacity);
list->cnt=0;
}
bool isempty(NODE*list){//判断是否为空
if(list->cnt==0){
return true;
}else{
return false;
}
}
bool isfull(NODE*list){//判断是否已满
if(list->cnt==list->capacity){
return true;
}else{
return false;
}
}
void append(NODE*list,int x){
if(isfull(list)){//如果数组已满,进行扩容
list->capacity*=2;
list->data=(int*)realloc(list->data,sizeof(int)*list->capacity);
}
list->data[list->cnt++]=x;
}
bool Insert(NODE*list,int pos,int x){
if(pos<1||pos>list->cnt+2){//可插到位置为1到list->cnt+2的位置,这里是因为数组是从下标为零开始存储
return false;
}
if(isfull(list)){//如果已满可进行扩容,可写一个扩容的函数比较方便
list->capacity*=2;
list->data=(int*)realloc(list->data,sizeof(int)*list->capacity);
}
for(int i=list->cnt;i>=pos;i--){
list->data[i]=list->data[i-1];
}
list->data[pos-1]=x;
list->cnt++;
return true;
}
bool delete(NODE*list,int pos){
if(pos<1||pos>list->cnt+1){
return false;
}
if(isempty(list)){
return false;
}
for(int i=pos-1;i<list->cnt;i++){
list->data[i]=list->data[i+1];
}
list->cnt--;
}
void traverse(NODE*list){
for(int i=0;i<list->cnt;i++){
printf("%d->",list->data[i]);
}
printf("NULL");
}
int main(){
NODE list;
init(&list);
append(&list,1);
append(&list,2);
append(&list,3);
append(&list,4);
append(&list,5);
Insert(&list,2,123);
append(&list,6);
delete(&list,5);
append(&list,7);
printf("%d",list.capacity);
printf("\n");
traverse(&list);
return 0;
}
2.链表实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct Node{
int data;//结点数据
struct Node*next;//结点指针
}NODE;
NODE* init(){//初始化
NODE*head=(NODE*)malloc(sizeof(NODE));
head->data=0;
head->next=NULL;
return head;
}
bool isempty(NODE*list){
if(list->data==0){
return true;
}else{
return false;
}
}
void Headinsert(NODE* list,int x){//头插法
NODE*NEWNODE=(NODE*)malloc(sizeof(NODE));
NEWNODE->data=x;
NEWNODE->next=list->next;
list->next=NEWNODE;
list->data++;
}
void Tailinsert(NODE*list,int x){//尾插法
NODE*temp=list;
while(temp->next){
temp=temp->next;
}
NODE*NEWNODE=(NODE*)malloc(sizeof(NODE));
NEWNODE->data=x;
NEWNODE->next=temp->next;
temp->next=NEWNODE;
list->data++;
}
bool Insert(NODE*list,int pos,int x){//插入
if(pos<1||pos>list->data+1){
return false;
}
NODE*temp=list;
int cnt=0;
while(cnt!=pos-1){
temp=temp->next;
cnt++;
}
NODE*NEWNODE=(NODE*)malloc(sizeof(NODE));
NEWNODE->data=x;
NEWNODE->next=temp->next;
temp->next=NEWNODE;
list->data++;
return true;
}
bool Delete(NODE*list,int num){
NODE*prenode=list;//前一个结点
NODE*freenode=list->next;//要删除的结点
while(freenode){//当freenode不为空的时候
if(freenode->data==num){//移动前先进行判断是否等于删除的数
prenode->next=freenode->next;//让前一个结点的next指向要删除的结点的下一个
free(freenode);//释放结点
list->data--;//数量减一
return true;
}
//不然则不断向后移动
prenode=freenode;
freenode=freenode->next;
}
return false;
}
void traverse(NODE*list){//遍历
NODE*temp=list->next;
while(temp){
printf("%d",temp->data);
temp=temp->next;
}
}
int main(){
NODE*list=init();
Headinsert(list,1);
Headinsert(list,2);
Headinsert(list,3);
Headinsert(list,4);//4->3->2->1
Tailinsert(list,5);//4->3->2->1->5
Insert(list,2,6);//4->6->3->2->1->5
Delete(list,2);//4->6->3->1->5
traverse(list);
return 0;
}