关于单链表的基本操做

来源:互联网 发布:印度综合实力 知乎 编辑:程序博客网 时间:2024/06/14 03:06
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct node
{
   ElementType data;
   struct node *next;
}LNode,*LinkList;
/*
  头插法对单链表的创建
*/
LinkList Create_LinkList1(){
LNode *s;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
     H->next=NULL;
  
   printf("请输入一个整数:");
   scanf("%d",&x);
   while(x!=-1)
   {
    s=(LinkList)malloc(sizeof(LNode));
    s->data=x;
    s->next=H->next;
    H->next=s;
     printf("\n请输入一个整数:"); 
    scanf("%d",&x);
}
 return H;
}
/*尾插法对链表的创建*/
 LinkList creat_LinkList2(){
LNode *s, *r;
int x;
LinkList H=(LinkList)malloc(sizeof(LNode));
r = H;
     H->next=NULL;//空表
    
    printf("请输入一个整数:");
    scanf("%d",&x);
    while(x!=-1)
{
    s=(LinkList)malloc(sizeof(LNode));
    s->data=x;
    s->next=r->next; 
    r->next=s;
    r=s;
    printf("\n请输入一个整数:");
    scanf("%d",&x);
   }
 return H;
}  
 /*求得单链表的长度*/
   int Length_LinkList(LinkList H){
   int j = 0;
   LNode *p=H;  
       
        while(p->next!=NULL)
{
         p=p->next;
         j++;
        } 
  return j;  
}
  /*通过某个序号对值进行查找*/
LinkList Get_Linklist(LinkList H,int k){
    LNode *p=H;
    int j=0;
    while(p->next!=NULL&&j<k)
{
         p=p->next;
j++;
    }
   if(j==k) return p;
     else return NULL;

 /*通过值来进行查找*/
LNode *Locate_LinkList(LinkList H, ElementType x){
     LNode *p=H->next;
     while(p!=NULL&&p->data!=x)
{
        p=p->next;
     }
     return p;
}
 /*在单链表的某个索引位置插入某个值*/
 int Insert_LinkList(LinkList H,int i,ElementType x){
 LNode *p,*s;
  p= Get_Linklist(H,i-1);
 if(p==NULL)
 {
printf("插入 %d 错误",i);
    return -1;
  }
 else
 {
   s=(LinkList)malloc(sizeof(LNode));
   s->data=x;
   s->next=p->next;
   p->next=s;
    return 1;
}

 /*
    按序号进行数据的删除
 */
int Del_LinkList(LinkList H,int i){
   LinkList p,q;
   p= Get_Linklist(H,i-1);
   if(p==NULL)
   {
       printf("第i-1个节点不存在");
        return -1;
    }
   else
   {
   if(p->next==NULL)
   {
    printf("第i个节点不存在");
   return -1;
    }
   else
   {
    q=p->next;
    p->next=q->next;
    free(q);
    return 1;
    }
}
    
}
/**
对链表进行倒置
**/
void Reverse(LinkList H){
  LNode *p,*q;
  p=H->next;//p指向第一个数据节点
  H->next=NULL;//将原链表值为空
  while(p)
  {
  q=p;
  p=p->next;
  q->next=H->next;
  H->next=q;
}
}
/*对链表中的值进行打印*/
void print_LinkList(LinkList H) {
LNode *p = H->next;
printf("单链表打印出的结果是:");
while (p!=NULL)
{
printf("%d  ",p->data);
p = p->next;
}
printf("\n");
}


/*单链表中删除重复节点*/
void pur_LinkList(LinkList H) {
LNode *p, *q, *r;
p = H->next;   //p指向第一个节点
if (p != NULL) {
while (p->next)
{
q = p;
while (q->next)
{
if (q->next->data == p->data) {
r = q->next;
q->next = r->next;
free(r);
}
else
{
q = q->next;
}
}
p = p->next;
}

}
}
void print(){
LinkList H=NULL;
     int i,k,x;

 
while (1)
{
printf("                                 1-使用头插法进行链表的创建\n");
printf("                                 2-使用尾插法实现链表的创建\n");
printf("                                 3-查看链表的长度\n");
printf("                                 4-按序号进行 查找\n");
printf("                                 5-按值x进行查找\n");
printf("                                 6-进行数据的插入\n");
printf("                                 7-进行数据的删除\n");
printf("                                 8-对数据进行倒置\n");
printf("                                 9-对数据进行打印\n");
printf("                                 10-删除单链表中重复的节点\n");
printf("\n请输入你要进行操作的序号:");
scanf("%d", &i);
switch (i)
{
case 1:H = Create_LinkList1();
 
   break;
case 2:H = creat_LinkList2();
    
     break;
case 3:printf("链表的长度为:%d\n",Length_LinkList(H)); break;
case 4:
printf("请输入你要查找的序号:");
scanf("%d", &k);
printf("%d \n", Get_Linklist(H, k)->data); break;
  
case 5:printf("请输入你要查找的值:");
scanf("%d", &x);
printf("查找的值为:%d\n", Locate_LinkList(H, x)->data); break;
case 6:printf("请输入你要在第几个位置插入的数:");
scanf("%d %d", &k, &x);
Insert_LinkList(H, k, x);
printf("插入成功! \n");
break;
case 7:
printf("请输入您要删除的序号:");
scanf("%d", &k);
Del_LinkList(H, k);
printf("删除成功!\n");
break;
case 8:Reverse(H);
printf("数据倒置成功,请查看!\n");
break;
case 9: print_LinkList(H); break;
case 10: pur_LinkList(H); break;
case 0: exit(0);
}
}
}
int main(void) {
print();
}







原创粉丝点击