#include<stdio.h>
#include<stdlib.h>
#define list_init_size 100 //在这里设置线性表长度可以方便以后的修改
#define listincrement 10
#define ok 1
#define overflow -1
#define error 0
typedef int status; //自定义status为int型,以后看到status等价于int
//线性表的单链表存储结构
typedef struct lnode{
int data; //存储实际数据
struct lnode *next; //存储下一节点的地址
}lnode,*linklist;
//取出链表中的某个数
status getelem(linklist l,int i,int &e)
{
//l为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK
lnode *p; //p用来指向节点地址,所以是lnode类型,用int声明会报错
linklist q;//等价于lnode *q
p=l->next; //p当前指向链表第一个节点
int j=1; //j为计时器
while(p&&j<i) //顺指针向后查找,直到p指向目标,或者超出链表范围仍未找到
{
p=p->next; //
++j;
}
if(!p||j>i) //不存在 ,函数结束执行
return ok;
e=p->data; //成功找到,把p指向的数据给e
return ok;
} //getelem
//插入元素
status listinsert(linklist &l,int i,int e)
{
//在带头结点的单链表L中的第i个位置之前插入元素e
lnode *p;
linklist s;
p=l;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return error;
s=(linklist)malloc(sizeof(lnode));
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}
status listdelete(linklist &l,int i,int &e)
{
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
lnode *p,*q;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return error;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return ok;
}//listdelete
void listcreate(linklist &l,int n)
{
//逆序数输入n个元素的值,建立带头结点的单链表L
linklist p,q;
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
for(int i=n;i>0;--i)
{
p=(linklist)malloc(sizeof(lnode));
scanf("%d",&p->data);
p->next=l->next;
l->next=p;
}
} //listcreate
void picture()
{
printf("\n**********这是一个图形界面**********\n");
}
int main()
{
int c,b;
picture();
linklist l;
listcreate(l,5);
lnode *p=l;
listinsert(l,3,333);
listdelete(l,4,b);
p=p->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
picture();
return 0;
}