链表

/* 2.链式线性表的建立、插入及删除。*/
#include 
#include 
#include 

#define OK   1
#define ERROR  0
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef struct Node    /*结点类型定义*/ 
{ 
	ElemType data;
	struct Node  * next;
}Node, *LinkList;  /* LinkList为结构指针类型*/

void init_linklist(LinkList *l)/*对单链表进行初始化*/
{
	*l=(LinkList)malloc(sizeof(Node)); /*申请结点空间*/
	(*l)->next=NULL;                      /*置为空表*/
}

void CreateFromTail(LinkList L)
{ 
	Node *r, *s;
	int c;
	int   flag =1; /*设置一个标志,初值为1,当输入-1时,flag为0,建表结束*/
	r=L;                /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
    printf("请输入数据,以-1结束:"); //输入生成单链表时的元素

	while(flag)         /*循环输入表中元素值,将建立新结点s插入表尾*/
	{
		scanf("%d",&c);
		if(c!=-1)
		{
			s=(Node*)malloc(sizeof(Node));
			s->data=c;
			r->next=s;
			r=s;
		}
		else
		{
			flag=0;
			r->next=NULL;   /*将最后一个结点的next链域置为空,表示链表的结束*/
		}
	}   
} 

int InsList(LinkList L,int i,ElemType e)
/*在带头结点的单链表L中第i个位置插入值为e的新结点*/
{  
      Node  *pre, *s;
      int k;
      if(i<=0) return ERROR;
      pre=L;   k=0;
      while(pre!=NULL&&knext;
            k=k+1;
       }
       if(pre==NULL)
       {  printf("插入位置不合理!");
           return ERROR;
        }
        s=(Node*)malloc(sizeof(Node));
        s->data=e;
        s->next=pre->next;
        pre->next=s;
        return OK;
}
//实验完成该部分的内容

int DelList(LinkList L,int i,ElemType *e)
/*在带头结点的单链表L中删除第i个元素,并将删除的元素保存到变量*e中*/
{  
     Node  *pre, *r;
     int  k;
     pre=L; k=0;
     while(pre->next!=NULL&&knext;
         k=k+1;
      }
      if(pre->next==NULL)
      {   
           printf("删除节点的位置i不合理!");
            return  ERROR;
       }
       r=pre->next;
       pre->next=r->next;
       *e=r->data;
       free(r);
       return  OK;
//实验完成该部分的内容

}

int Locate( LinkList L,ElemType key)
/*在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL*/ 
{ 
	Node *p;
	int n=0;
	p=L->next;    /*从表中第一个结点开始 */
	while (p!=NULL)
	{
		n++;
		if (p->data!=key)
			p=p->next; 
		else  
			break;      /*找到结点值=key时退出循环 */
	}
	if(p==NULL)n=0;
	return n;
} 

Node * Get (LinkList  L, int i)
/*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置; 否则返回NULL*/
{   
     int j;
     Node  *p;
     if(i<=0)  return  NULL;
     p=L;j=0;
     while((p->next!=NULL)&&(jnext;
         j++;
       }
       if(i==j)   return  p;
       else  return  NULL;
	//实验完成该部分的内容
}   

void Print(LinkList v)   
{//显示链表所有元素
 LinkList q;
 q=v->next;
 printf("链表所有元素:");
 while(q!=NULL)
   {printf("%d ",q->data);q=q->next;}
 printf("\n");
}

int main()
{LinkList L;
 int temp;
 int num,loc,flag=1;
 char j;
 int ch;
 Node *node;
 printf("本程序实现链式结构的线性表的操作。\n");
 printf("可以进行插入,删除,定位,查找等操作。\n");
 init_linklist(&L);
 CreateFromTail(L);      //生成单链表
 Print(L);          
 while(flag)
    { printf("请选择:\n");
      printf("1.显示所有元素\n");  //显示链表元素
      printf("2.插入一个元素\n");  //插入链表元素
      printf("3.删除一个元素\n");  //删除链表元素
      printf("4.按关键字查找元素\n");  //按关键字查找
      printf("5.按序号查找元素\n"); //按序号查找
      printf("6.退出程序      \n");  //退出
      scanf(" %c",&j);
      switch(j)
	{case '1':Print(L); break;
	 case '2':{printf("请输入元素(一个字符)和要插入的位置:\n");
		   printf("格式:数据,位置;例如:a,3\n");
		   scanf(" %d,%d",&ch,&loc);       //输入要插入的元素和要插入的位置
		   temp=InsList(L,loc,ch);      //插入
		   if(temp==ERROR) printf("插入失败!\n"); //插入失败
		   else printf("插入成功!\n"); //成功插入
		   Print(L);
		   break;
		  }
	 case '3':printf("请输入要删除的元素所在位置:");
		  scanf("%d",&loc);              //输入要删除的节点的位置
		  temp=DelList(L,loc,&ch);    //删除
		  if(temp==ERROR) printf("删除失败!\n"); //删除失败
		  else printf("成功删除了一个元素:%d\n",ch);   //删除成功,显示该元素
		  Print(L);
		  break;
	 case '4':if(L->next==NULL)                   //链表为空
		     printf("链表为空!\n");
		  else{printf("请输入要查找的元素:");
		       scanf(" %d",&ch);                //输入要查找的元素
		       ch=Locate(L,ch); //按关键字查找
		       if(ch==0) printf("没有找到该元素!\n"); //查找失败
		       else printf("该元素在链表的第%d个位置。\n",ch); 
                                           //成功查找,显示该元素位置
		      }
		  break;
	 case '5':if(L->next==NULL)                   //链表为空
		     printf("链表为空!\n");
		  else{printf("请输入要查找的位置:");
		       scanf("%d",&loc);    //输入要查找的元素的位置
		       node=Get(L,loc); //按序号查找
		       if(node==NULL) printf("该位置不存在!\n"); //查找失败
		       else printf("第%d个元素是:%d\n",loc,node->data);
                                //成功查找,显示该元素
		      }
		  break;
	 default:flag=0;printf("程序结束,按任意键退出!\n");
	}
    }
getchar();
}

你可能感兴趣的:(链表)