用c语言建立一个顺序存储的线性表,实现线性表的插入、删除操作
答案:3 悬赏:10 手机版
解决时间 2021-02-10 09:04
- 提问者网友:伴风望海
- 2021-02-10 03:58
用c语言建立一个顺序存储的线性表,实现线性表的插入、删除操作
最佳答案
- 五星知识达人网友:雪起风沙痕
- 2021-02-10 04:42
链表
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);//删除链表结点
}
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);//删除链表结点
}
全部回答
- 1楼网友:鸠书
- 2021-02-10 06:50
定义线性表:
#include "seq.h"
#include <stdio.h>
#include <stdlib.h>
typedef struct stack_node {
ETYPE data;
struct stack_node *prev, *next;
}NODE;
struct seq_struct {
// "Container" struct
NODE* top, *bottom;
int size;
};
插入:
void add_item(struct orderSlip *p,struct orderSlip a,int * num_items)
{
if ( *num_items < MAX_ITEMS )
{
p[*num_items] = a;
*num_items += 1;
}
}
删除:
void delete_item(struct orderSlip *p,int *num_items, int item)
{
if (*num_items > 0 && item < *num_items && item > -1)
{
int last_index = *num_items - 1;
for (int i = item; i < last_index;i++)
{
p[i] = p[i + 1];
}
*num_items -= 1;
}
}
- 2楼网友:轻熟杀无赦
- 2021-02-10 05:49
此顺序表实现了多个功能,代码很完善,我将其改成从键盘输入跟选择删除了,你根据你的需要自己再进行修改。
//common.h文件,头文件
#ifndef _common_h_
#define _common_h_
#include
#include
#include
#include
#define true 1
#define false 0
#define maxsize 100
typedef int datatype;
typedef struct
{
datatype data[maxsize];
int length;
}sqnode, *sqlink;
void creat_sqlist(sqlink *sq);
void set_empty_sqlist(sqlink sq);
int isempty_sqlist(sqlink sq);
int isfull_sqlist(sqlink sq);
int getlength_sqlist(sqlink sq);
datatype getelem(sqlink sq,int i);//i 为第i个元素
int locate_sqlist(sqlink sq, datatype x);//返回该元素在表中的位置
void insert_sqlist(sqlink sq, datatype x, int i);//表示在表中第i个位置前插入。
datatype del_sqlist(sqlink sq, int i);//删除表中第i个元素
void show_sqlist(sqlink sq);
#endif
//线性表实现的c代码
#include "common.h"
void creat_sqlist(sqlink *sq)
{
*sq = (sqlink)malloc(sizeof(sqnode));
assert(*sq);
bzero(*sq, sizeof(sqnode));
(*sq)->length = 0;
}
void set_empty_sqlist(sqlink sq)
{
sq->length = 0;
}
int isempty_sqlist(sqlink sq)
{
return sq->length == 0 ? true : false;
}
int isfull_sqlist(sqlink sq)
{
return sq->length == maxsize ? true : false;
}
int getlength_sqlist(sqlink sq)
{
return sq->length;
}
datatype getelem(sqlink sq, int i)//i为第i个元素
{
if(i<1 || i>getlength_sqlist(sq))
{
printf("i is wrong!\n");
return false;
}
return sq->data[i-1];
}
int locate_sqlist(sqlink sq, datatype x)//返回该元素在表中的位置
{
int j = 1;
while(j <= getlength_sqlist(sq))
{
if(sq->data[j-1] == x)
return j;
j++;
}
return false;
}
void insert_sqlist(sqlink sq, datatype x, int i)//表示在表中第i个位置前插入。
{
int j = 1;
if(isfull_sqlist(sq))
{
printf("sqlist is full!\n");
return;
}
if(i<1 || i>getlength_sqlist(sq)+1)
{
printf("i is not in the range!\n");
return;
}
for(j = getlength_sqlist(sq)-1; j>=i-1; j--)
{
sq->data[j+1] = sq->data[j];
}
sq->data[i-1] = x;
++sq->length;
}
datatype del_sqlist(sqlink sq, int i)//删除表中第i个元素
{
datatype ret;
if(isempty_sqlist(sq))
{
printf("sqlist is empty!\n");
return false;
}
if(i<1 || i>getlength_sqlist(sq))
{
printf("i is not in the range!");
return false;
}
for(i; i sq->data[i-1] = sq->data[i];
--sq->length;
return ret;
}
void show_sqlist(sqlink sq)
{
int j = 0;
for(j; j printf("%d,",sq->data[j]);
putchar('\n');
}
//main函数
#include "common.h"
int main (int argc, char *argv[])
{
int i = 0, n, id;
int num;
printf("你要往顺序表中插入几个元素\n");
scanf("%d", &num);
printf("请往顺序表中插入%d个元素:\n", num);
sqlink sq = null;
creat_sqlist(&sq);
while(i < num)
{
scanf("%d", &n);
insert_sqlist(sq, n, 1);
i++;
}
printf("顺序表的存储如下:\n");
show_sqlist(sq);
printf("你要删除第几个元素?\n");
scanf("%d", &id);
del_sqlist(sq, id);
printf("删除第%d个元素之后的顺序表为:\n", id);
show_sqlist(sq);
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯