这是你自己写的还是抄的? 构建新列表是指哪里哦?回答我,我帮你改
我看了下代码 顺序表的代码没错
应该能通过函数初始化输入数据的
然后你的输入数据的部分 怎么能直接这样插入呢 最好存到一个变量 然后用顺序表的插入方法插入这个元素
我给你改下:
#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
}
以上代码偏多,主要是多个层次和多个角度,全方位书写顺序表,真正项目一般使用一种插入和删除方法.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)