线性表L采用链式存储结构linklist,实现线性表删除元素操作:
【输入形式】第1行:整型数据n,表示线性表的长度;
第2行:n个整型数据,表示线性表的n个元素;
第3行:整型数据i,表示删除元素的位序;
【输出形式】
执行正确:
第1行:输出被删除元素;
第2行:输出线性表数据元素;
第3行:输出线性表长度;
执行失败:输出"error";
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define error 0
#define ok 1
#define overflow -2
typedef int status;
typedef int elemtype;
typedef struct lnode{
elemtype data;//数据域
struct lnode *next;//指针域
}lnode, *linklist;
//初始化链表
status initlist(linklist & l) {
lnode * temp;
temp = (lnode* )malloc(sizeof(lnode));
if(!temp) exit(overflow);
l = temp;
l->next =NULL;
return ok;
}
//输入(尾部插入)链表
status inputlist(linklist & l) {
lnode * curPtr, * rearPtr;
int n;
cin>>n;
rearPtr = l; //初始时头结点为尾节点,rearPtr指向尾巴节点
for (int i = 1;i <= n;i ++){ //每次循环都开辟一个新节点,并把新节点拼到尾节点后
curPtr = (lnode*)malloc(sizeof(lnode));//生成新结点
if(!curPtr) exit(overflow);
scanf(" %d",&curPtr->data);//输入元素值
curPtr->next = NULL; //最后一个节点的next赋空
rearPtr->next = curPtr;
rearPtr = curPtr;
}
return ok;
}
//输出
status listtraverse(linklist l)
{
linklist p=l;
while(p){
printf("%d",p);
p=p->next;
}
}
//销毁链表
void destroylist(linklist &l) {
linklist p = l;
while (p)
{
l = l->next;
delete(p);
p = l;
}
}
//按位序删除(带头结点)
status listdelete(linklist l,int i,elemtype &e)
{
if(i<1)
return false;
lnode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的第几个结点
p=l; //L指向头节点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i-1) //循环找到第i-1个结点
{
p=p->next;
j++;
}
if(p==NULL) //i值不合法
return false;
if(p->next==NULL) //第i-1结点之后已无其他结点
return false;
lnode *q=p->next; //令q指向被删除的结点
e=q->data; //用e返回元素值
p->next = q->next; //将*q结点从链中“断开”
free(q); //释放结点的存储空间
return true; //删除成功
}
main()
{
linklist l;int i;elemtype e;
initlist(l);
inputlist(l);
scanf("%d",&i);
linklist p = l;
if(listdelete(l,i,e))
{ printf("%d\n",e);
//listtraverse(l);
while(p){
//printf("%d",p);
cout<<p<<endl;
p=p->next;
}
}
else printf("error");
destroylist(l);
return 0;
}