数据结构顺序表问题
#include <stdio.h>;#include <stdlib.h>;
#define maxsize 100
#define ok 1
typedef int elemtype;
typedef struct {
elemtype *elem;
int length;
int initsize;
}sqlist;
void initlist(sqlist *L)
{
int n;
printf("请输入你想创建的顺序表长度:\n");
scanf("%d",&n);
L->elem=(elemtype *)malloc(sizeof(elemtype)*n);
L->length=0;
L->initsize=maxsize;
printf("请输入顺序表里的数值:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&L->elem);
L->length++;
}
printf("顺序表创建成功\n");
}
void DisplayList(sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d ",L->elem);
}
}
void listinsert(sqlist *L,int i,elemtype e)
{
int *p,*q;
printf("请输入你要插入的数字\n");
scanf("%d",&e);
printf("请输入你要插入的位置\n");
scanf("%d",&i);
q=&(L->elem);
if(i<1||i>L->length)
{
printf("error!");
}
else
{
for(p=&(L->elem);p>=q-1;p--){
*(p+1)=*p;
}
*q=e;
L->length++;
}printf("插入成功\n");
}
void listdelete(sqlist *L,int i,elemtype e)
{
printf("\n请输入你要删除第几位数:\n");
scanf("%d",&i);
if(i<1||i>L->length)
{
printf("error!");
}
else
{
for(i;i<=L->length;i++){
L->elem=L->elem;
}
L->length--;
}
}
void search(sqlist *L)
{
int e,i,k=0;
printf("\n请输入你想要查找的数字:");
scanf("%d",&e);
for(i=0;i<=L->length-1;i++){
if(e==L->elem)
{
k=1;
break;
}
}
if(k==1)
{
printf("\n查找成功,位于第%d位\n",i+1);
}
else
{
printf("\n查找失败!\n");
}
}
void shanchuduoyu(sqlist *L)
{
}
int main()
{
sqlist L;
int i,e;
initlist(&L);
listinsert(&L,i,e);
DisplayList(&L);
listdelete(&L,i,e);
printf("删除后表中数为:");
DisplayList(&L);
search(&L);
shanchuduoyu(&L);
DisplayList(&L);
return 0;
}
实验要求
(1)根据输入顺序表的长度n和n个无序整数值建立一个顺序表;
(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值;
(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值;
(4)在顺序表中查找值为e的数据元素,如果查找成功,则输出“查找成功!”和该元素在顺序表中的位置,否则输出“查找失败!”;
(5)根据输入顺序表的长度m和m个非递减的有序整数建立一个有序顺序表,然后删除其中所有的重复元素(即相同的整数只保留一个) ,最后输出删除后的有序顺序表中各元素值。
前四题已完成,请帮我看看哪有错的吗,还有第五题不会写。写在shanchuduoyu那里。 代码中存在一些问题,具体如下:
1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该直接使用。
2. 在listdelete函数中,应该先判断删除的位置是否合法,否则会出现数组越界的问题。
3. 在search函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。
4. 在shanchuduoyu函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。
5. 在shanchuduoyu函数中,应该先判断顺序表是否有重复元素,否则会出现删除错误的问题。
下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
#define ok 1
typedef int elemtype;
typedef struct {
elemtype *elem;
int length;
int initsize;
} sqlist;
void initlist(sqlist *L)
{
int n;
printf("请输入你想创建的顺序表长度:\n");
scanf("%d", &n);
L->elem = (elemtype *) malloc(sizeof(elemtype) * n);
L->length = 0;
L->initsize = maxsize;
printf("请输入顺序表里的数值:\n");
for (int i = 0; i < n; i++) {
scanf("%d", &L->elem[ i]);
L->length++;
}
printf("顺序表创建成功\n");
}
void DisplayList(sqlist *L)
{
for (int i = 0; i < L->length; i++) {
printf("%d ", L->elem[ i]);
}
printf("\n");
}
void listinsert(sqlist *L, int i, elemtype e)
{
printf("请输入你要插入的数字:\n");
scanf("%d", &e);
printf("请输入你要插入的位置:\n");
scanf("%d", &i);
if (i < 1 || i > L->length + 1) {
printf("error!\n");
return;
}
elemtype *p = &(L->elem);
elemtype *q = &(L->elem);
while (p >= q) {
*(p + 1) = *p;
p--;
}
*q = e;
L->length++;
printf("插入成功\n");
DisplayList(L);
}
void listdelete(sqlist *L, int i, elemtype e)
{
printf("请输入你要删除第几位数:\n");
scanf("%d", &i);
if (i < 1 || i > L->length) {
printf("error!\n");
return;
}
elemtype *p = &(L->elem);
while (p < &(L->elem)) {
*p = *(p + 1);
p++;
}
L->length--;
printf("删除成功\n");
DisplayList(L);
}
void search(sqlist *L)
{
if (L->length == 0) {
printf("顺序表为空!\n");
return;
}
int e, i, k = 0;
printf("请输入你想要查找的数字:\n");
scanf("%d", &e);
for (i = 0; i < L->length; i++) {
if (e == L->elem[ i]) {
k = 1;
break;
}
}
if (k == 1) {
printf("查找成功,位于第%d位\n", i + 1);
} else {
printf("查找失败!\n");
}
}
void shanchuduoyu(sqlist *L)
{
if (L->length == 0) {
printf("顺序表为空!\n");
return;
}
int i, j;
for (i = 0, j = 1; j < L->length; j++) {
if (L->elem[ i] != L->elem) {
L->elem[++i] = L->elem;
}
}
L->length = i + 1;
printf("删除成功\n");
DisplayList(L);
}
int main()
{
sqlist L;
int i, e;
initlist(&L);
listinsert(&L, i, e);
listdelete(&L, i, e);
search(&L);
shanchuduoyu(&L);
return 0;
}
第五题的实现思路:
1. 遍历顺序表,如果当前元素与前一个元素相同,则将当前元素删除。
2. 删除元素后,需要将后面的元素向前移动。
3. 最后,更新顺序表的长度。 isdkz 发表于 2023-9-20 21:57
代码中存在一些问题,具体如下:
1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该 ...
这个最后还需要排个序,排成递增的
页:
[1]