当前位置:首页 » 编程语言 » c语言线性表的插入

c语言线性表的插入

发布时间: 2022-04-30 20:10:53

Ⅰ 插入线性表c语言

修改了下 代码如下:
#include<stdio.h>

const int maxsize=18;

struct sequenlist
{
int a[maxsize];
int len;
}seq;

/*
*
* 初始化线性表
*/
sequenlist init(sequenlist l)
{
l.len=100;
return l;
}

/*
*
* 初始化线性表2
*/
void input(sequenlist &l)
{
int n;
printf("请你输入线性表元素的个数n:");
scanf("%d",&n);
l.len=n;
int i=0;
printf("请你输入线性表n个元素:");
for(i=0;i<l.len;i++)
{
scanf("%d",&l.a[i]);
}
}

/*
*
* 遍历线性表
*/
void out(sequenlist l)
{
int i=0;
for(i=0;i<l.len;i++)
{
printf("%d ",l.a[i]);
}
}

/**
*
* 插入元素
**/
void insert(sequenlist &l,int X,int index)
{
if(index<0 && index>=l.len)
printf("索引 index 无效,插入失败!");
else
{
int j;
for(j=l.len-1;j>=index-1;j--)
{
l.a[j+1]=l.a[j];
}
l.a[index-1]=X;
l.len++;
}
}

/**
* 删除元素
*
*/
void delet(sequenlist &l,int index)
{
int j;
for(j=index;j<=l.len-1;j++)
{
l.a[j-1]=l.a[j];
}
l.len--;
}

void main()
{

input(seq);
out(seq); //遍历
printf("\n");
insert(seq,5,10);
out(seq); //遍历
printf("\n");
delet(seq,5);
out(seq); //遍历
printf("\n");
}

Ⅱ c语言线性表的实现中的头插法和尾插法

头插法建表:算法
p=(ListNode*)malloc(sizeof(ListNode));//生成新结点
p->data=ch;//将读入的数据放入新结点的数据域中
p->next=head;
head=p;
尾插法建表:算法
p=(ListNode*)malloc(sizeof(ListNode));//生成新结点
p->data=ch;//将读入的数据放入新结点的数据域中
if(head==NULL)
head=p;//新结点插入空表
else
rear->next=p;//将新结点插到*r之后
rear=p;//尾指针指向新表尾

时间复杂度都是O(n)

Ⅲ c语言简单程序,有一段线性表插入的函数,请高手详细解析,十分感谢

这是数据结构中标准的线性表插入程序,但是它不是真正的c语言,而是类c哦。
status Insertlist(Sqlist &L,int i,Elemtype e){
Elemtype *p; //在这里定义了一个*p的指针,目的是找到链表中每个结点的首地址就可以了,不用找一个结点的所用地址啊
int j;
if(L.length==L.listsize) //L.listsize是代表的表的上限值,是事先设定好的
printf("内存分配空间已不够,请重新分配:\n");
p=L.elem;//这条语句应该写在下一条语句的后面,也就是分配后的地址给到临时指针变量p中
L.elem=(Elemtype *)realloc(p,(LISTSIZE+L.listsize)*sizeof(Elemtype));
//这条语句是想一下子分配足够大的线性表空间,realloc在C中不认可的,实现时还要用malloc,这里只是设计实现的,而分配成功后L.elem只是得到分配单元的首地址,不成功则是空值。
if(!p){
printf("分配空间失败");
exit(0);
}
L.elem=p;//这条语句应该没用吧
L.length++;//这条语句应该放在成功插入的后面,也就是return 1;语句之前才对
L.listsize=L.listsize+LISTSIZE_INCE;
if(i<1||i>L.length){ //这里用到的是运算符||,代表是“或”,也就是说i<1代表输入时误操作造成,而i>L.length代表输入的位置超出表中数据的个数,位置找不到。
printf("插入位置输入不正确,请重新操作:\n");
return 0;//代表插入失败
}
else{
for(j=L.length-1;j>=i;j--)//从i到最后表尾顺次下移,腾出i的位置
L.elem[j+1]=L.elem[j];
L.elem[i]=e;//将数据插入到i的位置中
return 1;//代表插入成功
}
return 1;
}

Ⅳ 利用c语言实现顺序存储线性表的插入!

有时会出现这种情况。他会以为是木马。
int GetElem();
int InstInsert();
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间基地址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
int InitList(SqList *L){
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(-1);//存储空间分配失败
L->length=0; //空表长度为0
L->listsize=LIST_INIT_SIZE; //初始存储容量
printf("线性链表创建成功\n");
return OK;
}
int Input(SqList *L){
ElemType temp,*newbase;
printf("输入顺序列表的数据,以0为结束标志\n");
scanf("%d",&temp);
while(temp!=0){
if(L->length>=L->listsize){
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!newbase) exit(-1);//存储空间分配失败
L->elem=newbase; //空间新基地址
L->listsize+=LISTINCREMENT; //增加存储容量
}
L->elem[L->length++]=temp;
scanf("%d",&temp);
}
printf("输入数据结束!!\n");
return OK;
}
int Onput(SqList *L){
int i=0;
printf("输出线性表数据:");
while(i<L->length){
printf("%d\t",L->elem[i]);
i++;
}
printf("\n");
}
int ClearList(SqList *L){
L->length=0;
printf("清除成功!\n");
return OK;
}
void ListEmpty(SqList L){
if(L.elem!=NULL)
printf("true!\n");
else
printf("false!\n");
}
void ListLength(SqList L){
printf("线性表的长度是:%d\n",L.length);
return ;
}
int GetElem(SqList L,int i,SqList *e){
e=L.elem[i-1];
return e;
}
void PriorElem(SqList L,int cur_e,SqList *pre_e){
if(cur_e!=L.elem[0]){
pre_e=L.elem[0];
printf("前驱值为:%d\n",pre_e);
}
else
printf("pre_e无意义\n");
}
void NextElem(SqList L,int cur_e,SqList *next_e){
if(cur_e!=L.elem[L.length-1]){
next_e=L.elem[L.length-1];
printf("后继值为:%d\n",next_e);
}
else
printf("next_e无意义\n");
}
int ListInsert(SqList *L,int i,int e){
ElemType *newbase,*p,*q;
if(1>i||i>(L->length+1))
return -1;
if(L->length>=L->listsize){ //新增内存
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //开辟新内存空间
if(!newbase)
exit(-1); //存储分配失败
L->elem=newbase; //新基地址
L->listsize+=LISTINCREMENT; //新增内存容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
++L->length;
return OK;
}
int ListDelete(SqList *L,int i,int e){
ElemType *p,*q;
if(i<1||i>L->length)
return -1;
q=&(L->elem[i-1]);
e=L->elem[i-1];
p=L->elem+L->length-1;
for(;p>=q;q++)
*q=*(q+1);
--L->length;
printf("删除的值为:%d\n",e);
return OK;
}

Ⅳ 用c语言建立一个顺序存储的线性表,实现线性表的插入、删除操作

链表
1。是由结构体和指针构成的。
2。包括两个部分一个是数据域和指针域。
3。链表中的结点分为两类:头结点和一般结点。头结点是没有数据域的。
4。基本操作有:初始化链表,增加结点和删除结点,求链表的长度等等。
struct Linknode{
int data;
struct Linknode *next;
};
这个地方有个知识点:这个是链表的数据结构是有结构体和指针构成。结构体名为Linknode.但这里面没有定义结构体变量,只有我们定义了结构体变量才能使用结构体。
结构体变量怎么定义呢?
有两种方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我们都希望采用第2种,这样的好处是: 当我们再定义结构体变量时,可以用:Linklist p;而如果我们采用第一种还必须采用 struct Linknode p;对比一下就可以知道第2种要简单很多。那么下面我们都采用第2种方式来定义结构体变量。
上面我们已经定义了一个链表:
1。初始化链表。
#include<stdio.h>
#include<stdlib.h>
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等于L,对与*Lnode的分配空间相当与对主函数中的L分配空间。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化链表的时候,我们用到了2级指针为什么呢?因为我们希望在InitLinkList函数生成的头结点,主函数中也能指向这个头结点。如果我们用一级指针的话,用malloc分配空间的时候,它将会返回分配空间的首地址给指针变量Lnode,而不能使是的空间被主函数中指针变量L得到这个地址。所以我们要用2级指针。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加链表结点
增加链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
break;
p=Lnode->next;//p指向头结点
//通过while循环和指针变量p定位要插入的结点q的位置。
while(p)
p=p->next;
//生成一个要插入的结点
q=(Linklist)malloc(sizeof(Linklist));//申请要插入的结点空间
q->data=d;//填充要插入结点的数据域
q->next=p->next;//首先填充要插入结点q的指针域进行填充。
p->next=q;//然后把定位好的p指针域进行修改指向q.

}while(9);//循环退出的条件是输入的数据-9999

}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
}
3。求链表的长度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向链表的第一个结点。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入一个结点
LengthLinkList(L)//求链表的长度。
}
4.删除结点
删除链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向链表的头结点
while(p)
{
q=p->next;//q指向当前结点的下一个结点。
free(p);//释放当前结点
p=q;//p指向下一个结点
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
LengthLinkList(L)//求链表的长度。
DestroyLinkList(L);//删除链表结点
}

Ⅵ C语言线性表插入数据

你这个程序问题太多了,我不建议在这个程序的基础上修改,有问题的程序总是会把人的思维搞乱,建议你对着书打一遍,然后把标准例程和你这个进行比较,你会发现你的问题在哪里。

我来帮你总结一下:
1、主函数中你对print函数的调用形式不对。你的print函数没有返回值,不能用空返回值为p和head赋值,这没有意义也不符合逻辑;而且,print函数调用的时候括号里没有带参数!这是很严重的错误
2、inlist函数本来就没有返回值,却被定义成int型的,它的参数head也没有被使用,这在线性链表中简直了。。。
3、你用了两个全局变量,用a 来记录链表长度本无可厚非,但是你竟然用全局指针变量,这非常容易导致逻辑错误的,应当尽量避免。
4、你的插入函数inlist算法存在问题(自己写的难免会有问题):你没有为插入的节点分配空间,而是准备直接覆盖原来那个位置的节点的值,这是不对的。如果考虑到分配空间,并且不用全局指针的话,算法还要考虑插入的位置是在头插入,尾插入还是中间插入,这三种情况是不同的。因此,插入函数绝对没有你想的这么简单。
5、我没有看懂你main函数里p是用来干什么的。

综合以上内容,我认为你逻辑混乱。我的建议是照着书上打一遍,然后一句一句的在纸上模拟执行,画出链表,观察执行过程的变化,并且理解它,然后记住他的算法,再不看书自己打一遍。此外,建议你仔细看书上有关函数调用的内容。

热点内容
linux下php编译安装 发布:2025-05-15 08:30:37 浏览:591
c语言八进制十六进制 发布:2025-05-15 08:22:17 浏览:282
华为安卓如何更新鸿蒙 发布:2025-05-15 08:18:52 浏览:373
工商密码器是什么 发布:2025-05-15 08:18:50 浏览:751
c语言自考 发布:2025-05-15 07:52:42 浏览:501
压缩的玉 发布:2025-05-15 07:51:22 浏览:790
android的控件 发布:2025-05-15 07:50:36 浏览:553
南岗法院服务器ip地址 发布:2025-05-15 07:46:02 浏览:288
实况如何退出账号安卓 发布:2025-05-15 07:45:56 浏览:919
深入编译器 发布:2025-05-15 07:41:35 浏览:879