数据结构顺序表插入程序怎么写

数据结构顺序表插入程序怎么写,第1张

这是你自己写的还是抄的? 构建新列表是指哪里哦?回答我,我帮你改

我看了下代码  顺序表的代码没错

应该能通过函数初始化输入数据的

然后你的输入数据的部分 怎么能直接这样插入呢 最好存到一个变量 然后用顺序表的插入方法插入这个元素

我给你改下:

#include <stdio.h>

#include <malloc.h>

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

typedef struct

 int *elem,*m 

 int length 

 int listsize

}SqList

int InitList_Sq(SqList &L) //构造空的线性表L

 L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)) //注意大小写,下同 

 if(!L.elem) 

  return(-1)

 L.length=0 

 L.listsize=LIST_INIT_SIZE 

 return 1

}//InitList_Sqint 

int Insert_SqList(SqList &L,int i,int x)  //把x插入递增有序表L中

 int *p,*q 

 if(i<1||i>L.length+1)

  return(-1)

 if(L.length+1>L.listsize)  

 {

  L.m=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int))

  if(!L.m) 

   return(-1)

   L.elem=L.m

   L.listsize +=LISTINCREMENT

  } 

  q=&(L.elem[i-1])

 for(p=&(L.elem[L.length-1])p>=q--p)

  *(p+1)=*p

 *q=x

 ++L.length

 return 1}

//Insert_SqList

void main()

 int i,x,temp

 SqList L

 /*L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)) 

 L.length=10

 L.listsize=LIST_INIT_SIZE  //不能用函数初始化 */

 InitList_Sq(L)

 printf("how many nums to put:")

 scanf("%d",&x)

  for(i=0i<xi++) 

  {  

  printf("Please input nums(%d):\n",i+1)  

  scanf("%d",&temp)

  Insert_SqList(L,i+1,temp)

  }

  printf("输入要插入元素x:\n")

  scanf("%d",&x)

  printf("输入要插入元素x的位置i:\n")

  scanf("%d",&i)

 

  Insert_SqList(L,i,x)   //调用函数不用加返回类型 

  for(i=0i<L.lengthi++)

  printf("%d\t",L.elem[i])

  printf("\n")

}

运行结果如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MaxSize 50

#define len(x) sizeof(x)/sizeof(x[0])

typedef struct SqList

{

int data[MaxSize]

int length

}SqList

static SqList Create(int a[],int n)//用一个数组创建静态顺序表

static void Print(SqList L)//打印一个静态顺序表

static void ListInsert(SqList *p,int i,int e)//L的第i个位置插入e

static void ListDelete(SqList *p,int i)//删除列表第i个数据

static int LocateElem(SqList L,int e)//查找第一个值等于e的元素,返回其位序

static void Reverse(SqList *p,int left,int right)//逆置表的第left到right的元素顺序

/*递增序列折半查找等于e的元素,返回其位序*/

static int Binsearch(SqList L,int e)

int main()

{

int a[]={1,2,3,4}

SqList L=Create(a,len(a))

ListInsert(&L,2,100)

ListDelete(&L,2)

Reverse(&L,1,4)

Print(L)

printf("%d\n",Binsearch(L,2))

}

static SqList Create(int a[],int n)

{

SqList L

int i

L.length=n

for(i=0i<L.lengthi++)

L.data[i]=a[i]

return L

}

static void Print(SqList L)

{

int i

for(i=0i<L.lengthi++)

printf("%d ",L.data[i])

printf("\n")

}

static void ListInsert(SqList *p,int i,int e)

{

int j

if(i<1 || i>p->length+1)

{printf("错误范围\n")}

if(p->length>=MaxSize)

{printf("存储空间已满\n")}

for(j=p->lengthj>=ij--)

p->data[j]=p->data[j-1]

p->data[i-1]=e

p->length++

}

static void ListDelete(SqList *p,int i)

{

if(i<1 || i>p->length)

{printf("删除范围出错\n")return}

while(i<p->length)

{

p->data[i-1]=p->data[i]i++

}

p->length--

}

static int LocateElem(SqList L,int e)

{

int i

for(i=0i<L.lengthi++)

if(L.data[i]==e)

return i+1

return 0

}

static void Reverse(SqList *p,int left,int right)

{

int temp

if(left>right || left<1 || right>p->length)

{printf("错误的输入\n")return}

for(left--,right--left<rightleft++,right--)

{

temp=p->data[left]

p->data[left]=p->data[right]

p->data[right]=temp

}

}

static int Binsearch(SqList L,int e)

{

int mid,low=0,high=L.length-1

while((low+1)!=high)

{

mid=(low+high)/2

if(L.data[mid]==e) return mid+1

if(e<L.data[mid]) high=mid

if(e>L.data[mid]) low=mid

}

return 0

}

ListInsert 和 ListDelete 为你所要的函数

#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

}

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11087874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存