数据结构期末复习||第二章 线性表 知识点+代码(超全总结)

内容超级详细,源代码(注释在源代码有)在最后!任何问题可以留言

一、逻辑结构:线性表

二、物理结构:顺序表+链接表

 (一)顺序表

 1.定义&创建空表

2.插入

插入位置1:下标p位置 

 插入位置2,3:p+1,p-1

 3.销毁

4.查找

 

(二)链接表

 

源代码

//头歌:顺序表-课上练
#include <stdio.h>
#include <stdlib.h>
/*此处是顺序线性表数据结构定义*/
typedef int DataType;
struct seqList
{//有3个数据成员
  int MAXNUM;//能存放的最大元素个数的 整型 MAXNUM   
  int curNum;//数据元素的个数         整型  curNum
  DataType* element;//数据元素的连续空间的起始地址  
};typedef struct seqList *PseqList;

/*第一关 创建空顺序线性表*/
PseqList createNullList_seq(int m)
{//创建一个空的顺序线性表,能存放的最大元素个数为 m
 //若m=0,则返回NULL 
      if(!m)
      { 
        return NULL;
      } 
      else
      {
        PseqList head = (PseqList)malloc(sizeof(struct seqList));
        head->element = (DataType*)malloc(m*sizeof(DataType));  //动态分配内存
        head->curNum = 0;  //空表长度为0
        head->MAXNUM = m;  //初始化存储容
        return head;
      }
}

//第二关 插入
int isFullList_seq(PseqList L)
{
  //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
  if(L->MAXNUM == L->curNum)    return 1;
  else    return 0;
}
 
 
int insertP_seq(PseqList L , int p ,int x)
{// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
   //如果线性表满了, 还需输"list is full"的提示
  //如果插入位置非法,需输出提示"position is illegel" 
  if(L->curNum == L->MAXNUM)
  {  
    printf("list is full");
    return 0;
  }
  if(p >= L->curNum + 1 || p < 0)
  {
    printf("position is illegel");
    return 0; 
  }
  
  for (int i = L->curNum; i >= p + 1 ; i --)
  {
    L->element[i] = L->element[i - 1]; 
  }
  L->element[p] = x;
  L->curNum++;
 
  return 1;   
}
 
int insertPre_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    insertP_seq(L , p - 1 ,x);
    
}
 
int insertPost_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    insertP_seq(L , p + 1 ,x);
    
}
 
void printList_seq(PseqList L)
{//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
  for(int i = 0; i < L->curNum; i ++ )
    printf("%d ",L->element[i]);
 
}
 
//第三关
int destroyList_seq(PseqList L)
{
    //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
    if(L == NULL)    return 0;
    int m = L->curNum;
    free(L->element);
    free(L);
    return m;
    
}
 
//第四关
int locate_seq(PseqList L,int x)
{//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
  for(int i = 0; i < L->curNum; i ++ )
    if(L->element[i] == x)    return i;
  return -1;
    
}
 
DataType locatePos_seq(PseqList L,int pos)
{// 在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
  if(pos < 0 || pos >= L->curNum)    return L->element[0];
  return L->element[pos];
    
}
 
//第五关
int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
  if(pos < 0 || pos >= L->curNum)    return -1;
  for(int i = pos; i < L->curNum - 1; i ++)    L->element[i] = L->element[i + 1];
  L->curNum--;
  return 1;
    
}
 
int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  //可以使用之前已完成的操作
  int cnt = 0,num = L->curNum;
  int i = 0,j = 0;
  for(int i = 0; i < num; i ++)
  {
    if(L->element[i] != x)
    {
        L->element[j++] = L->element[i];
    }
    else    L->curNum--,cnt++;
  }
  return cnt;
  
  
  
}
 
 
//第六关
void replace_seq(PseqList L,int x,int y)
{//将顺序表L中值为x的数据元素替换为y
  for(int i = 0; i < L->curNum; i ++) 
  {
    if(L->element[i] == x)    L->element[i] = y;
  }
 
}
 
void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
  //使用常规删除即可,已修改测试用例
  for(int i = 0; i < L->curNum; i ++) 
  {
    int sign = 0;
    for(int j = i + 1; j < L->curNum; j ++) 
    {
      if(L->element[i] == L->element[j])
      {
        for(int k = j; k < L->curNum - 1; k ++)
        {
          L->element[k] = L->element[k + 1];
        }
        L->curNum--;
        sign = 1;
      }
    }
    if(sign == 1)
    {
      for(int j = i; j < L->curNum - 1; j ++) L->element[j] = L->element[j + 1];
      L->curNum--;
    }
  }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个完整版的线性表代码,包括顺序表链表两种实现方式: 1. 顺序表实现: ```c #define MaxSize 100 // 定义线性表的最大长度 typedef struct { int data[MaxSize]; // 存储线性表元素的数组 int length; // 线性表的当前长度 } SqList; // 顺序表类型定义 // 初始化线性表 void InitList(SqList &L) { for (int i = 0; i < MaxSize; i++) { L.data[i] = 0; // 将所有元素初始化为0 } L.length = 0; // 线性表长度初始化为0 } // 插入元素 bool ListInsert(SqList &L, int i, int e) { if (i < 1 || i > L.length + 1) { // 判断插入位置是否合法 return false; } if (L.length >= MaxSize) { // 判断线性表是否已满 return false; } for (int j = L.length; j >= i; j--) { // 将插入位置后的元素依次后移 L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; // 将新元素插入到指定位置 L.length++; // 线性表长度加1 return true; } // 删除元素 bool ListDelete(SqList &L, int i, int &e) { if (i < 1 || i > L.length) { // 判断删除位置是否合法 return false; } e = L.data[i - 1]; // 将被删除的元素赋给e for (int j = i; j < L.length; j++) { // 将删除位置后的元素依次前移 L.data[j - 1] = L.data[j]; } L.length--; // 线性表长度减1 return true; } // 查找元素 int LocateElem(SqList L, int e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) { return i + 1; // 返回元素在线性表位置 } } return 0; // 没有找到返回0 } ``` 2. 链表实现: ```c typedef struct Node { int data; // 存储数据元素 struct Node *next; // 存储下一个节点的指针 } LNode, *LinkList; // 链表节点类型定义和链表类型定义 // 初始化链表 void InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); // 创建头节点 L->next = NULL; // 头节点的指针域初始化为NULL } // 插入元素 bool ListInsert(LinkList &L, int i, int e) { LinkList p = L, s; // p指向头节点,s为新节点 int j = 0; while (p && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p || j > i - 1) { // 判断插入位置是否合法 return false; } s = (LinkList)malloc(sizeof(LNode)); // 创建新节点 s->data = e; // 将新元素赋给新节点 s->next = p->next; // 将新节点插入到第i个节点之后 p->next = s; return true; } // 删除元素 bool ListDelete(LinkList &L, int i, int &e) { LinkList p = L, q; // p指向头节点,q为待删除节点 int j = 0; while (p->next && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p->next || j > i - 1) { // 判断删除位置是否合法 return false; } q = p->next; // 将待删除节点赋给q e = q->data; // 将待删除节点的元素赋给e p->next = q->next; // 将待删除节点从链表删除 free(q); // 释放待删除节点的内存空间 return true; } // 查找元素 int LocateElem(LinkList L, int e) { LinkList p = L->next; // p指向第一个节点 int i = 1; while (p) { // 遍历链表 if (p->data == e) { return i; // 返回元素在链表位置 } p = p->next; i++; } return 0; // 没有找到返回0 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值