Chinaunix首页 | 论坛 | 博客
  • 博客访问: 503241
  • 博文数量: 114
  • 博客积分: 5022
  • 博客等级: 大校
  • 技术积分: 1355
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-09 18:01
文章分类

全部博文(114)

文章存档

2012年(1)

2011年(3)

2010年(1)

2009年(16)

2008年(23)

2007年(39)

2006年(31)

我的朋友

分类: C/C++

2008-08-25 11:22:27

本文原为转载,但发现插入和删除第一个节点出错,本文改过来了
#include
#include
#define OK 1
#define ERROR 0
typedef  int ElemType ;
typedef  int status;
typedef struct node
{
ElemType data;
struct node *next;
}Lnode,*LinkList;//Lnode为变量类型,LinkList为指针
int Insert_List(LinkList &head,int n)//插入N个元素放在带表头结点链表中。
{
 head= (Lnode *) malloc(sizeof(Lnode));//还可写成  (LinkList )malloc(sizeof(struct node)); (struct node *)malloc(sizeof(struct node));
 head->next=NULL;//带表头结点的head先申请单元,第一个结点不放线性表中的数据元素
 int x;
 printf("input %d  number in to create  list",n);
 for(int i=1;i<=n;i++)
 {
 scanf("%d",&x);//读入X
 LinkList p=(LinkList)malloc(sizeof(Lnode));//申请结点空间
 if(p==NULL)
  return ERROR;
 p->data=x;//赋值数据
 p->next=head->next;//插入表头、第一个结点单元,实际上第一个  
 head->next=p;//接头,与head链接
}
return OK;
}
void  Destory_List(LinkList &head)//释放空间
{
LinkList p=head->next;//从第一个有效结点开始
while(p)//当p有效结点没有结束时
{
head->next=p->next;//修改链表,(保存链表)或者head->next=head->next->next;
free(p);//释放P
printf("dispose one   real  space \n");//打印提示信息
p=head->next;//修改下一个要释放的结点
}
free(head);//释放头
printf("dispose the head space \n");//打出提示信息
}
void Print_List(LinkList head)
{
LinkList p=head->next;//第一个有效结点开始打印
while(p)
{
printf("%d    ",p->data);//打印
p=p->next;//后移
}
printf("\n");
}
int GetElem_List(LinkList head,int i,ElemType &e)
{
int k=1;//计数器初始化为1
LinkList p=head->next;//第一个有效结点
while((k{
p=p->next;//后移
k++;//计数
}
if(p)
    { e=p->data;//取值
    return OK;//成功
    }
else return ERROR;// 失败没有这个位置的数据
}
int Insert_List(LinkList &head,int i,ElemType e) //在线性表中第i个元素之间插入e
{
int k=1; //计数
LinkList last=head;//从头开始打i的位置 last表示前面一个结点
LinkList q=last->next;//q表示线性表中第i个结点,Last的后继
while((k{
last=q; //保存前驱
q=q->next; //后移
k++; //计数
}
if(q==NULL) //判断我Q是否为空
   return ERROR; //返回失败
else
 {
LinkList p= (LinkList)malloc(sizeof(Lnode));//要插入的结点
p->data=e;//赋值
  p->next=q;//链尾
   last->next=p; //链头
return OK;//
}
}
int Delete_List(LinkList &head,int i,ElemType &e) //删除线性表中第i个元素,并且把值用e带回
{
int k=1; //计数
LinkList last=head; //第一个有效结点,last为前驱
LinkList p=last->next; // /p为第i个结点
while((k{
last=p; //保存前驱
p=p->next; //Insert_List 后移
k++; //计数
}
if(p==NULL) //非空
  return ERROR;  //失败
else {
 e=p->data; //取值
last->next=p->next; //删除p
free(p); //释放空间
printf("delete i in the linklist \n"); //打印提示信息
return OK; //成功
}
}
void main()
{
LinkList L1;
Insert_List(L1,5);//建立5个元素的线性表
Print_List(L1);//打印
int x;
int j;
printf("\n input j to getList \n");//输入J, 取第J个线性表中的元素
scanf("%d",&j);// 读
GetElem_List(L1,j,x);//调用取第J个线性表中的元素
printf("%d \n",x);//输入X插入线性表
printf("input x to insert \n");
scanf("%d",&x);
int i;
printf("input i to port insert_List\n");//输入I,表示第I个位置之间插入X
scanf("%d",&i);
Insert_List(L1,i,x);//调用 插入X在第I个位置之间
Print_List(L1);//打印
int e;
printf("input i to DeleleList i \n");
scanf("%d",&i);
Delete_List(L1,i,e);//删除第I个位置的元素
printf("%d\n",e);//打印被 删除的元素
Print_List(L1);//打印表
 Destory_List(L1);//释放空间
}
阅读(1559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~