如何建造一个空的顺序表,然后再向里面插入数据,C语言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何建造一个空的顺序表,然后再向里面插入数据,C语言相关的知识,希望对你有一定的参考价值。


#include <stdio.h>
#include <stdlib.h>
/*
 1.创建结构体-----具体事物的抽象
 2.创建链表
 3.创建结点
 4.插入操作
  4.1 表头插入
  4.2 表尾插入
  4.3 指定位置插入(指定位置的前面)
 5.删除操作
  5.1 表头删除
  5.2 表尾删除
  5.3 指定位置删除
 6.判断是否为空
 7.打印链表
*/
//单链表的结构体
typedef struct SingleList

 //数据域
 int data; //以这个数据为例
 //struct MM  myMM;
 //指针域
 struct SingleList *next;
LIST,*LPLIST;
/*
 别名:习惯大写
 起别名---小名
 //好处:单词少,好看(含义更精简)
 struct SingleList  换一种叫法:  LIST;
 strcut SingleList *  换一种叫法: LPLIST
*/
//------->2.创建链表  ---任何结构都需要用一个东西去表示
LPLIST CreateList()

 //创建过程就是初始化过程---初始化基本数据成员过程
 //需要内存空间
 LPLIST List = (LPLIST)malloc(sizeof(LIST));
 if (List == nullptr)
 
  printf("失败了\\n");
  system("pause");
  exit(0);
 
 //初始化基本数据成员----有表头的链表
 List->next = nullptr;
 return List;

//------->3.创建结点  
LPLIST CreateNode(int data)

 //1.需要内存
 LPLIST Node = (LPLIST)malloc(sizeof(LIST));
 //2.初始化基本数据成员
 Node->data = data;  //和创建链表多了数据域
 Node->next = nullptr;
 return Node;

//------->4.1 头插法
//函数写法:形参可以表示要操作的东西
//插入的链表是(List),插入的数据是多少(data)
void InsertListHeadNode(LPLIST List,int data)

 //插入:创建插入的结点
 LPLIST newNode = CreateNode(data);  //创建结点
 //插入操作
 newNode->next = List->next;
 /*
  c=1
  b=2
  a=c;
  c=b;
 */
 List->next = newNode;

//------->4.2 尾插法
void InsertListTailNode(LPLIST List, int data)

 //找到表尾--->定义一个移动的指针
 LPLIST tailNode = List;
 while (tailNode->next != nullptr)
 
  tailNode = tailNode->next;
 
 //创建插入的结点
 LPLIST newNode = CreateNode(data);
 tailNode->next = newNode;

//------->4.3 指定位置
void InsertListAppoinNode(LPLIST List, int data, int PosData)

 //创建两个移动的指针:去找指定位置和指定位置的前面
 LPLIST frontNode = List;
 //frontNode->next==taiNode:判断相邻
 LPLIST tailNode = List->next;
 //判断是否为空
 while (tailNode->data != PosData)
 
  /*
  frontNode=frontNode->next;
  tailNode=tailNode->next;
  */
  frontNode = tailNode;
  tailNode = frontNode->next;
  if (tailNode == nullptr)
  
   printf("未找到指定位置\\n");
   system("pause");
   exit(0);
  
 
 //tailNode->data=data;
 //找到后创建插入的结点
 LPLIST newNode = CreateNode(data);
 frontNode->next = newNode;
 newNode->next = tailNode;


//------->5.判断是否为空
  //和创建的时候比较
int  IsEmptyList(LPLIST List)

 if (List->next == nullptr)
  return 1;  //返回1表示为空
 return 0;   //表示不为空

////------->6.打印数据
void PrintList(LPLIST List)

 if (IsEmptyList(List))
 
  printf("链表为空,无法打印");
  system("pause");
  exit(0);
 
 LPLIST pNext = List->next;
 while (pNext != nullptr)
 
  printf("%d\\t", pNext->data);
  pNext = pNext->next;
 
 printf("\\n");

//------->7.删除
  //头删除
void DeleteListHeadNode(LPLIST List)

 if (IsEmptyList(List))
 
  printf("链表为空,无法删除\\n");
  system("pause");
  exit(0); 
 
 LPLIST DNode = List->next;
 List->next = DNode->next;
 free(DNode);
 DNode = nullptr;

//------->8.尾删
void DeleteListTailNode(LPLIST List)

 if (IsEmptyList(List))
 
  printf("链表为空,无法删除\\n");
  system("pause");
  exit(0);
 
 //找到表尾--->定义一个移动的指针
 LPLIST tailNode = List->next;
 LPLIST tailFront = List;
 while (tailNode->next != nullptr)
 
  tailFront = tailNode;
  tailNode = tailFront->next;
 
 tailFront->next = nullptr;
 free(tailNode);

//------->9.指定位置删除
void DeleteListAppoinNode(LPLIST List, int PosData)

 //创建两个移动的指针:去找指定位置和指定位置的前面
 LPLIST frontNode = List;
 //frontNode->next==taiNode:判断相邻
 LPLIST tailNode = List->next;
 //判断是否为空
 while (tailNode->data != PosData)
 
  /*
  frontNode=frontNode->next;
  tailNode=tailNode->next;
  */
  frontNode = tailNode;
  tailNode = frontNode->next;
  if (tailNode == nullptr)
  
   printf("未找到指定位置\\n");
   system("pause");
   exit(0);
  
 
 frontNode->next = tailNode->next;
 free(tailNode);


int main()

 LPLIST List = CreateList();  //List创建成功
 printf("插入:\\n");
 InsertListHeadNode(List, 1);
 InsertListHeadNode(List, 2);
 InsertListHeadNode(List, 3);
 InsertListTailNode(List, 0);
 PrintList(List);
 printf("删除:\\n");
 DeleteListHeadNode(List);
 PrintList(List);
 DeleteListTailNode(List);
 PrintList(List);
 printf("指定位置:\\n");
 //看不懂,可以找群主
 InsertListAppoinNode(List, 4, 2);
 InsertListAppoinNode(List, 3, 2);
 //C/C++ 8群
 PrintList(List);
 // 491994603
 DeleteListAppoinNode(List, 2);
 PrintList(List);
 system("pause");
 return 0;

以上代码偏多,主要是多个层次和多个角度,全方位书写顺序表,真正项目一般使用一种插入和删除方法.

参考技术A #include <stdio.h>

#define ListSize 100 //表空间的大小
typedef int DataType;//数据类型

//定义顺序表结构体
typedef struct

DataType data[ListSize];//数据域
int length; //当前的表长度
SeqListNode,*SeqList;

//顺序表的初始化
void InitSeqList(SeqList L)//顺序表的初始化即将表的长度置为0

L->length=0;

//按位置插入数据,i-指定插入位置(i前面插入),x-插入值
int Insert_SL(SeqList L,int i,DataType x)

int j;

//表空间溢出
if (L->length >= ListSize)

printf("表空间溢出\n");
return 0;


//检验插入元素是否合法
if(i<1 || i>ListSize)

printf("插入位置:%d不合法!\n",i);
return 0;

else

//数组元素后移,为插入元素空出位置
for(j=L->length-1;j>=i-1;j--)

L->data[j+1]=L->data[j];


//插入数据元素
L->data[i-1]=x;
//表长加1
L->length++;


return 1;


//打印顺序表
int SeqListPrint(SeqList L)

int i;
if(L->length==0)

printf("顺序表为空\n");
return 0;


printf("顺序表:\n");
for(i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
return 1;


int main()

int i;
DataType x;
int num;
SeqListNode L,*lp=&L;

//表的初始化
InitSeqList(lp);

printf("请输入元素个数:");
scanf("%d",&num);
//录入数据
for(i=1;i<=num;i++)

printf("输入第%d个元素:",i);
scanf("%d",&x);
if(Insert_SL(lp,i,x)!=1)
return 0;


//打印顺序表
SeqListPrint(lp);
return 1;
参考技术B typedef struct    
ElemType *elem;   //定义了顺序表中元素类型的数组指针,指向顺序表存储空间的基址    
int length;       //顺序表的长度(也即元素个数)    
int listsize;     //当前分配给顺序表的存储容量
SqList;    
 
2.顺序表的初始化
接下来对该顺序表进行初始化,为顺序表分配一个预定义大小的数组空间,并将当前顺序表长度设为0,如果元素个数大于分配的存储容量则再对容量进行扩充(初始化时不扩充,顺序表使用中按需要进行容量扩充)。代码如下:
Status InitList(SqList *L)    
(*L).elem=(ElemType*)malloc(100*sizeof(ElemType));    //不知什么问题不能用LIST_INIT_SIZE,必须用100,下面的realloc函数也是一样?    
if((*L).elem==NULL)        
exit(OVERFLOW);
     
(*L).length=0;    
(*L).listsize=LIST_INIT_SIZE;    
return ok;

参考技术C

可以在pandas中创建一个空DataFrame的方法,类似于创建了一个空字典,之后向里面插入数据

例如:

empty =pandas.DataFrame("name":"","age":"","sex":"")

想要向empty中插入一行数据。

(1)创建一个DataFrame。

new= pandas.DataFrame("name":"","age":"","sex":"",index=["0"])。

(2)开始插值    ignore_index=True,可以帮助忽略index,自动递增。

empty.append(new,ignore_index=True)

(3)最重要的,赋值给empty.

empty= empty.append(new,ignore_index=True)

参考技术D https://github.com/77Sera/Data-Structure
里面有个sequence list的源码。。点进去看吧

插入排序算法及C语言实现

插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。

直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。

很多初学者所说的插入排序,实际上指的就是直接插入排序算法,插入排序算法还包括折半插入排序2-路插入排序表插入排序希尔排序等,后序文章都会一一讲到。

例如采用直接插入排序算法将无序表{3,1,7,5,2,4,9,6}进行升序排序的过程为:

  • 首先考虑记录 3 ,由于插入排序刚开始,有序表中没有任何记录,所以 3 可以直接添加到有序表中,则有序表和无序表可以如图 1 所示:



    图 1 直接插入排序(1)
     

  • 向有序表中插入记录 1 时,同有序表中记录 3 进行比较,1<3,所以插入到记录 3 的左侧,如图 2 所示:


    插入排序算法及C语言实现
    图 2 直接插入排序(2)
     

  • 向有序表插入记录 7 时,同有序表中记录 3 进行比较,3<7,所以插入到记录 3 的右侧,如图 3 所示:


    插入排序算法及C语言实现
    图 3 直接插入排序(3)
     

  • 向有序表中插入记录 5 时,同有序表中记录 7 进行比较,5<7,同时 5>3,所以插入到 3 和 7 中间,如图 4 所示:


    插入排序算法及C语言实现
    图 4 直接插入排序(4)
     

  • 向有序表插入记录 2 时,同有序表中记录 7进行比较,2<7,再同 5,3,1分别进行比较,最终确定 2 位于 1 和 3 中间,如图 5 所示:


    插入排序算法及C语言实现
    图 5 直接插入排序(5)
     

  • 照此规律,依次将无序表中的记录 4,9 和 6插入到有序表中,如图 6 所示:



    图 6 依次插入记录4,9和6


直接插入排序的具体代码实现为:

#include <stdio.h>//自定义的输出函数void print(int a[], int n ,int i){ printf("%d:",i); for(int j=0; j<8; j++){ printf("%d",a[j]); } printf("
");}//直接插入排序函数void InsertSort(int a[], int n){ for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。 int j= i-1; int x = a[i]; while(j>-1 && x < a[j]){ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间 a[j+1] = a[j]; j--; } a[j+1] = x; //插入到正确位置 } print(a,n,i);//打印每次排序后的结果 }}int main(){ int a[8] = {3,1,7,5,2,4,9,6}; InsertSort(a,8); return 0;}

运行结果为:

1:13752496
2:13752496
3:13572496
4:12357496
5:12345796
6:12345796
7:12345679


直接插入排序算法本身比较简洁,容易实现,该算法的时间复杂度O(n2)

插入排序的其它 4 种排序方法,在后序章节中有详细介绍。


以上是关于如何建造一个空的顺序表,然后再向里面插入数据,C语言的主要内容,如果未能解决你的问题,请参考以下文章

如何从平面结构有效地建造树木?

1.完整语段的增删改 2.单表查询 3.多表查询

数据结构 c语言版 ——顺序表的查找、插入与删除

C语言实训

线性表的动态内存分配顺序存储结构

建立一个含10个元素的顺序线性表 然后在第i个位置插入元素M 再在第j个位置删除元