菜鸟之路--线性表__顺序存储

本文介绍了一个简单的链表数据结构实现,包括链表的创建、插入、删除等基本操作,并通过一个具体的C语言示例展示了如何使用这些函数进行链表操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</pre><pre name="code" class="cpp"> #include <stdio.h>
 #include <stdlib.h>
 //链表的定义以及基本操作
 typedef void List;
 typedef void ListNode;
 //创建一个空链表,并返回
 List * List_Create(int capacity);
 //将链表清空
 void  List_Clear(List * list);
 //销毁链表
 void  List_Destroy(List *list);
 //删除指定位置的数据
 ListNode * List_Delete(List *list,int pos);
 //往链表内插入数据
 int List_Insert(List * list,ListNode * node);
 //得到链表中位置为pos的数据
 ListNode * List_Get(List * list,int pos);
 //返回链表的长度
 int List_Length(List *list);


//顺序链表的相关定义
 typedef struct _tag_linklist  TgList;
 typedef int TgListNode;
 struct _tag_linklist{
            int length;
            int capacity;
            TgListNode * node;
  };

  //线性顺序存储链表具体操作的相关实现
 List * List_Create(int capacity)
 {
     TgList * ret = NULL;
     if(capacity>0){
        //注意此处的内存分配大小计算
        ret = (TgList *)malloc(sizeof(TgList)+sizeof(TgListNode) * capacity);
     }
     if(ret != NULL){
        ret->capacity = capacity;
        ret->length = 0;
     //注意此处加1操作
        ret->node = (TgListNode *)(ret+1);
     }
     return ret;
 }
 void  List_Clear(List * list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL){
        tlist->length = 0;
     }
 }
void  List_Destroy(List *list)
{
    free(list);
}
int List_Insert(List * list,ListNode * node)
{
    TgList * tlist = (TgList *)list;
    if(tlist->length<tlist->capacity){
       tlist->node[tlist->length++] = (TgListNode) node;
       return 1;
    }
    return 0;


}
ListNode * List_Delete(List *list,int pos)
{
    TgList * tlist = (TgList *)list;
    ListNode * tnode = List_Get(list,pos);
    int i;
    if(tlist !=NULL && pos<tlist->length){
       for(i=pos;i<tlist->length-1;i++)
       {
            tlist->node[i] = tlist->node[i+1];
       }
       tlist->length--;
    }
    return tnode;
}
 ListNode * List_Get(List * list,int pos)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL && pos<tlist->length)
     {
         return (ListNode *)tlist->node[pos];
     }
     return NULL;
 }
 int List_Length(List *list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist !=NULL) {
            return tlist->length;
     }
 }
 //返回链表最大容量
 int List_Capacity(List * list)
 {
     TgList * tlist = (TgList *)list;
     if(tlist != NULL){
        return tlist->capacity;
     }
     return -1;
 }
 //添加输出函数用于具体测试
 void List_Print(List *list)
 {
    TgList * tlist = (TgList *)list;
    int i;
    if(tlist != NULL){
       for(int i=0;i<tlist->length;i++) {
            printf("the %d element %d\n",i+1,tlist->node[i]);
       }
    }
 }
 int main()
 {
     int a[5] ={1,2,3,4,5};
     int i;
     List * list = List_Create(5);
     for(i=0;i<5;i++){
        //注意这里要将int强制转换为void *
        List_Insert(list,(void *)a[i]);
     }
     List_Print(list);
     printf("%d\n",List_Length(list));
     printf("%d\n",List_Capacity(list));
     printf("%d\n",List_Delete(list,3));
     List_Print(list);
     printf("%d\n",List_Length(list));
     printf("%d\n",List_Capacity(list));
     printf("%d\n",List_Get(list,3));
     return 0;
 }


在C++中,我们可以创建一个简单的顺序表(数组实现),用于实现上述功能。这里是一个简化的例子: ```cpp #include <iostream> class SequentialList { private: int* data; // 存储数据的指针 int size; // 线性表当前元素个数 int capacity; // 容量 public: SequentialList(int initialCapacity = 5) { data = new int[initialCapacity]; capacity = initialCapacity; size = 0; } ~SequentialList() { // 析构函数,防止内存泄漏 delete[] data; } // 判断线性表是否为空 bool isEmpty() const { return size == 0; } // 求线性表长度 int length() const { return size; } // 获取指定位置的元素 (索引从0开始) int get(int index) const { if (index >= 0 && index < size) { return data[index]; } throw std::out_of_range("Index out of range"); } // 求前驱 (返回值为-1,因为顺序表无前驱节点) int predecessor(int index) const { if (index > 0) { return get(index - 1); } else { return -1; } } // 求后继 (返回值为-1,因为顺序表无后继节点) int successor(int index) const { if (index < size - 1) { return get(index + 1); } else { return -1; } } // 在指定位置插入元素 void insertAt(int index, int value) { if (index < 0 || index > size) { throw std::out_of_range("Invalid insertion index"); } if (size == capacity) { resize(capacity * 2); // 当满时扩大容量 } for (int i = size; i > index; --i) { data[i] = data[i - 1]; } data[index] = value; ++size; } // 删除指定位置的元素 void removeAt(int index) { if (index < 0 || index >= size) { throw std::out_of_range("Invalid removal index"); } for (int i = index; i < size - 1; ++i) { data[i] = data[i + 1]; } --size; } // 显示线性表 void display() const { for (int i = 0; i < size; ++i) { std::cout << "Element at index " << i << ": " << data[i] << " "; } std::cout << "\n"; } // 清空线性表 void clear() { for (int i = 0; i < size; ++i) { data[i] = 0; } size = 0; } // 输入负数退出程序 static void inputExit() { std::cin >> size; if (size < 0) { exit(0); // 使用系统退出,终止程序 } } }; int main() { SequentialList list; list.inputExit(); // 调用各个方法... // ... list.clear(); // 清空线性表 list.display(); // 显示线性表 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值