线性表的基本操作
运行到删除就错了,谁帮忙改改,谢谢!
#include
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE];
int last;
int length;
}SeqList;
int InitList(SeqList *L)//初始化线性表
{
L->length=0;
return OK;
}
int InsList(SeqList *L,int i,ElemType x)//在i位置插入x
{
int k;
if((i<1)||(i>L->last+2))
{
printf("插入位置不合法");
return ERROR;
}
if(L->last==MAXSIZE-1)
{
printf("表已满,无法插入");
return ERROR;
}
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=x;
L->last++;
return OK;
}
int Locate(SeqList *L,ElemType x)//查找元素的位置
{
int i=0;
while((i<=L->last)&&(L->elem[i]!=x))
i++;
if(i<=L->last)
return (i+1);
else
return (-1);
}
int DelList(SeqList *L,int i,ElemType *e)//删除指定的数据
{
int k;
*e=L->elem[i-1];
for(k=i;k<=L->last;k++)
L->elem[k-1]=L->elem[k];
L->last--;
return OK;
}
int main()
{
SeqList *L;
int i,j,h;
ElemType x,y;
ElemType *e;
L=(SeqList *)malloc(sizeof(SeqList));
InitList(L);
printf("输入线性表的长度\n");
scanf("%d",&(L->length));
L->last=L->length-1;
printf("输入线性表的数据元素\n");
for(i=0;ilength;i++)
scanf("%d",&(L->elem[i]));
printf("输入要插入数据的位置和数据\n");
scanf("%d %d",&j,&x);
if(InsList(L,j,x))
{
printf("插入成功!\n");
printf("插入后的数据为\n");
for(i=0;i<=L->last;i++)
printf("%d",L->elem[i]);
printf("\n");
}
else
printf("插入不成功!\n");
printf("输入要删除的数据\n");
scanf("%d",&y);
h=Locate(L,y);
if(h!=-1)
{
DelList(L,h,e);
printf("成功删除后的数据为\n");
for(i=0;i<=L->last;i++)
printf("%d",L->elem[i]);
printf("\n");
}
else
printf("要删除的数据不存在\n");
for(i=0;i<=L->last;i++)
printf("%d",L->elem[i]);
free(L);
}
------解决思路----------------------
DelList(L,h,e); // 这个e是个未经初始化的野指针,在DelList里面直接给*e赋值是要出问题的。
而且我没看懂DelList里面这一行是干什么的*e=L->elem[i-1];
直接改成DelList(SeqList *L,int i)不就很好吗,多个参数是什么作用呢?
------解决思路----------------------
仅供参考//带表头结点的单向链表
#include
#include
#include
#include
struct NODE {
int data;
struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t,m;
int main() {
srand(time(NULL));
//填写头节点数据
H.data=-1;
H.next=NULL;
head=&H;
//创建10个节点的单链表
p=head;
for (i=0;i<10;i++) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=rand()%100;//填写0..99的随机值
q->next=NULL;
p->next=q;
p=q;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//将值为5的结点插入到单链表的第k个结点前
k=3;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=5;
q->next=p->next;