单链表的9的操作

来源:互联网 发布:人工智能机器人龙头股 编辑:程序博客网 时间:2024/04/27 14:49
#include<stdio.h>
#include<malloc.h>
 typedef int ElementType;
 #define ERROR -1
 #define OK 1
typedef struct node
{
ElementType Element;
struct  node *next;
}LinkList;


//创建链表
LinkList *CreateList()
{
LinkList *head;
head=(LinkList *)malloc(sizeof(LinkList));//创建带头结点的空链表
head->next=NULL;
return head;
}


//求链表的元素个数
ElementType Size(LinkList *L)
{
LinkList *p=L->next;
int k=0;
while(p)
{
k++;
p=p->next;
}
return k;
}


//在链表l的第k个位置插入元素x 
int Insert(LinkList *L,int k, ElementType x)
{
if(k < 1)return ERROR;
LinkList *p=L, *s;
int i=0;
while(p && i<k-1){p=p->next;i++;}//寻找第k-1个节点
if (!p || i>k-1) return ERROR;
s = (LinkList*)malloc(sizeof(LinkList)); 
s->Element=x;
s->next = p->next;
p->next = s;
return OK;
}


//删除链表L的第k个元素
int Delete(LinkList *L,int k, ElementType *e)
{
if(k < 1)return ERROR;
LinkList *p=L,*q;
int i=0;
while(p && i<k-1){p=p->next;i++;}//寻找第k-1个节点
if (!p || i>k-1) return ERROR;
q=p->next;
p->next=q->next ;
*e=q->Element;
free(q);
return OK;
}


int Delete2(LinkList *L,int k, ElementType *e)
{
if(k < 1)return ERROR;
LinkList *p=L,*q;
int i=0;
while( p->next && i<k-1){p=p->next;i++;}//寻找第k个节点,并另p指向其前驱
if (!p->next|| i>k-1) return ERROR;
q=p->next;
p->next=q->next ;
*e=q->Element;
free(q);
return OK;
}
//判断链表是否为空
int IsEmpty(LinkList *L)
{
return L->next == NULL;
}


//求链表第k个元素的值
ElementType GetData(LinkList *L,int k)
{
LinkList *p = L;
int i=0;
if(k < 1)return ERROR;
while(p && i<k){p=p->next;i++;}//寻找第k个节点
if (!p || i>k) return ERROR;
k = p->Element;
return k;
}


//查找值为x的元素
LinkList * Find(LinkList *L,ElementType x)
{
LinkList *p=L;
while(p = p->next)
{
if (p->Element == x)break; //或者LinkList *p=L->next;while(p && p->Element != x)p = p->next;
}
if (p)
 return p;
}


//输出链表 
void Print(LinkList *L)
{
LinkList *p=L->next;
printf("输出元素为:\n");
while(p)
{
printf("%3d",p->Element);
p = p->next; 
}
}


//清空链表 
void Clear(LinkList *L)
{
LinkList *p,*q;
p = L->next;
while(p)
{
q=p->next;//或者while(q!=NULL){q=p;p=p->next;free(q);}
free(p);
p=q;


}
L->next = NULL;
}
int main()
{int a,e;
  LinkList *list = CreateList();
  a=IsEmpty(list);
  if(a==1)
printf("该表为空表\n");
  printf("\n");
  Insert(list, 1, 10);
  Insert(list, 1, 20);
  Insert(list, 2, 50);
  Delete2(list, 3,&e);
  //Delete(list, 3,&e);
  printf("删除的元素为:%d",e);
  printf("\n");
  a=IsEmpty(list);
  if(a==0)
printf("该表为非空表\n");
  Insert(list, 1, 30);
  Insert(list, 1, 40);
  printf("元素为30的地址为:%o\n", Find(list,30));
  printf("元素为40的地址为:%o\n", Find(list,40));
  printf("链表的元素个数为:%d\n", Size(list));
  Print(list);
  printf("链表的第1个元素为:%d",GetData(list, 1));
}
原创粉丝点击