数据结构顺序表的插入删除

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;
#define ElementType int
#define LIST_INCREMENT 50
#define Status bool
#define ERROR false
#define OK true
#define INITIALSIZE 50;
typedef struct SequenceList {
    ElementType *datas;
    ElementType listsize;
    ElementType length;
}SeqList;

typedef struct LinkedList {
    LinkedList *next;
    LinkedList *prev;
    ElementType  data;    
}*LinkList;

/**
 * @brief 插入链表
 * 
 * @param seqList 
 * @param i 
 * @param x 
 * 
 * @return 
 **/
Status LinkInsert(SeqList *seqList,int i,ElementType x){
    if(i <1 || i >= seqList->listsize + 1){
        return ERROR;
    }
    
    if(seqList->listsize > seqList->length){
        ElementType *newBase 
            = (ElementType*)realloc(seqList->datas,(seqList->listsize + LIST_INCREMENT)*sizeof(ElementType));
        if(!newBase){
            return ERROR;
        }else {
            seqList->datas = newBase;
            seqList->datas[i]= x;
            seqList->listsize += LIST_INCREMENT;
        }    
    }
    seqList->datas[i-1] = x;
    seqList->length++;
    return OK;
}
/**
 * @brief 初始化顺序表
 * 
 * @param seq 
 * 
 * @return 
 **/
SeqList* initList(SeqList *seq){
    seq->length=0;
    seq->listsize = INITIALSIZE;
    ElementType capcity = sizeof(ElementType)*INITIALSIZE;
    seq->datas= (ElementType*)malloc(capcity);
    return seq;
};
/**
 * @brief 删除单链表的中的元素
 * 
 * @param seq 
 * @param i 
 * @param x 
 * 
 * @return 
 **/
Status deleteEle(SeqList *seq,ElementType i,ElementType x){
    if(i < 1 || i > seq->length){
        return ERROR;
    }
    x = seq->datas[i-1];
    ElementType *p = &(seq->datas[i - 1]);
    ElementType *q = &(seq->datas[0]) + seq->length - 1;
    for(++p;p < q;++p){
        *(p-1) = *p;
    }
    seq->length--;
    return OK;
}
/**
 * @brief 头插法建立单链表
 * 
 * @param L 
 * @param n 
 * 
 * @return 
 **/
LinkedList* createList(LinkedList *L,ElementType n){
    L->next = NULL;
    for(int i = n; i>=0; i--){
        LinkList p = (LinkList)malloc(sizeof(LinkList));
        p->data = i;
        p->next = L->next;
        L->next = p;
    }
    return L;
}

/**
 * @brief 尾插法建立单链表
 * 
 * @param head 
 * 
 * @return 
 **/
LinkedList* createListR(LinkList head) {
    if(head == NULL){
        head = (LinkList)malloc(sizeof(LinkList));
    }
    LinkedList *r = head;
    LinkedList *s;
    char ch;
    while((ch = getchar())!='\n'){
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = ch;
        r->next = s;
        r= s;
    }
    r->next = NULL;
    return head;
}

/**
 * @brief 合并顺序表
 * 
 * @param p 
 * @param q 
 * @param r 
 * 
 * @return 
 **/
SeqList* mergeSeq(SeqList *p,SeqList *q,SeqList *r){
    ElementType *pa  = &(p->datas[0]);
    ElementType *pb  = &(q->datas[0]);
    ElementType *pc  = &(r->datas[0]);
    ElementType *plast = &(p->datas[0]) + p->length;
    ElementType *qlast = &(q->datas[0]) + q->length;
    r->length = p->length + q->length;
    if(!r){
        exit(0);
    }
    while(pa < plast || pb < qlast){
        if(*pa < *pb){
            *(pc++) = *(pa++);
        }else {
            *(pc++)= *(pb++);
        }
    }
    while(pa < plast){
        *(pc++) = *(pa++);
    }
    while(pb < qlast){
        *(pc++) = *(pb++);
    }
    return r;
}
/**
 * @brief 删除链表元素
 * 
 * @param list 
 * @param pos 
 * 
 * @return 
 **/
Status deleteLinkList(LinkList list,ElementType pos){
    LinkList  p = list;
    ElementType j = 0;
    while(p->next && j < pos){
        p = p->next;
        ++j;
    }
    if(!p){
        return ERROR;
    }
    LinkList q = p->next;
    p->next = q->next;
    free(p);
    return OK;
}

int main(){
    SeqList *seq = (SeqList*)malloc(sizeof(SeqList));
    seq = initList(seq);
    printf("ele is %d\n", seq->datas[0]);
    printf("ele is %d\n", seq->length);
    printf("ele is %d\n", seq->listsize);
    for(int i = 0; i <10;i++){
        LinkInsert(seq,i,i);
    }
    printf("size is %d\n", seq->length);
    ElementType r = -1;
    deleteEle(seq,3,r);
    printf("ele size is %d",seq->length);
    SeqList *l1 = (SeqList*)malloc(sizeof(SeqList));
    SeqList *l2 = (SeqList*)malloc(sizeof(SeqList));
    SeqList *l3 = (SeqList*)malloc(sizeof(SeqList));
    initList(l1);
    initList(l2);
    initList(l3);
    for(int i = 0; i <10;i++){
        LinkInsert(l1,i,i);
    }
    for(int i = 0; i <10;i++){
        LinkInsert(l2,i,i+10);
    }
    l3 = mergeSeq(l1,l2,l3);
    for(int i = 0; i < l3->length; i++){
        printf("ele is %d\n",l3->datas[i]);
    }
    free(l1);
    free(l2);
    free(l3);
    LinkList list = (LinkList)malloc(sizeof(LinkList));
    list = createList(list,10);
    //deleteLinkList(list,3);
    while(list!=NULL){
        printf("ele data is %d\n",list->data);
        list = list->next;
    }
    LinkList head = (LinkList)malloc(sizeof(LinkList));
    head = createListR(head);
    printf("ele char is %c",head->next->data);
    return 0;
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序是一种基于数组的数据结构,可以实现随机访问和快速插入删除操作。以下是 C++ 实现顺序插入删除的代码示例: ```c++ #include <iostream> using namespace std; const int MAX_SIZE = 100; // 定义最大长度 // 定义顺序结构体 typedef struct { int data[MAX_SIZE]; // 存放数据 int length; // 当前长度 } SeqList; // 初始化顺序 void InitList(SeqList &L) { L.length = 0; } // 插入元素 bool ListInsert(SeqList &L, int pos, int val) { if (pos < 1 || pos > L.length + 1) { return false; // 插入位置不合法 } if (L.length >= MAX_SIZE) { return false; // 顺序已满 } for (int i = L.length; i >= pos; i--) { L.data[i] = L.data[i - 1]; // 依次后移 } L.data[pos - 1] = val; // 插入新元素 L.length++; // 长度加一 return true; } // 删除元素 bool ListDelete(SeqList &L, int pos) { if (pos < 1 || pos > L.length) { return false; // 删除位置不合法 } for (int i = pos; i < L.length; i++) { L.data[i - 1] = L.data[i]; // 依次前移 } L.length--; // 长度减一 return true; } // 输出顺序 void PrintList(SeqList L) { for (int i = 0; i < L.length; i++) { cout << L.data[i] << " "; } cout << endl; } int main() { SeqList L; InitList(L); ListInsert(L, 1, 10); ListInsert(L, 2, 20); ListInsert(L, 3, 30); PrintList(L); // 输出 10 20 30 ListDelete(L, 2); PrintList(L); // 输出 10 30 return 0; } ``` 这里使用了结构体来定义顺序,其中 `data` 数组存放数据, `length` 示当前长度。`InitList` 函数用于初始化顺序, `ListInsert` 函数用于插入元素, `ListDelete` 函数用于删除元素, `PrintList` 函数用于输出顺序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值