链表的建立、查找、插入、删除

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_Qin_AC/article/details/83107399
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<malloc.h>
#include<stack>
using namespace std;
typedef struct LNode
{
 int data;
 struct LNode *next;
} LinkList;
void InitList(LinkList *&head)//初始化链表
{
 head =(LinkList*)malloc(sizeof(LinkList));
 head->next=NULL;
}
void CreateListA(LinkList *&head,int a[],int n)//尾插法
{
 LinkList *r,*s;
 r = head;
 for(int i = 0;i<n;i++)
 {
 s = (LinkList*)malloc(sizeof(LinkList));
 s->data= a[i];
 r->next= s;
 r = s;
 }
 r->next=NULL;
}
void CreateListB(LinkList *&head,int a[],int n)//头插法
{
 LinkList *s;
 s = head;
 for(int i = 0;i<n;i++)
 {
 s= (LinkList*)malloc(sizeof(LinkList));
 s->data=a[i];
 s->next = head->next;
 head->next=s;
 }
}
void DestroyList(LinkList *&head)
{
 LinkList *pre = head,*p = head->next;
 while(p!=NULL)
 {
 free(pre);
 pre= p;
 p = pre->next;
 }
 free(pre);
}
bool ListEmpty(LinkList *&head)
{
 return (head->next==NULL);
}
int ListLength(LinkList *&head)//长度
{
 LinkList *p;
 p = head;
 int num = 0;
 while(p->next!=NULL)
 {
 num++;
 p = p->next;
 }
 return num;
}
void DisplayList(LinkList *&head)//线性输出
{
 LinkList *p = head->next;
 while(p!=NULL)
 {
 cout<<p->data<<" ";
 p = p->next;
 }
 cout<<endl;
}
/*bool GetElem(LinkList *head,int i,int &e)//第I个元素输出
{
 LinkList *p;
 p = head;
 for(int j = 0;j<i&&p!=NULL;j++)
 {
 p = p->next;
 }
 if(p==NULL)
 return false;
 else
 {
 e = p->data;
 return true;
 }
}*/
int LocateElem(LinkList *head,int e)//定位元素
{
 LinkList *p = head->next;
 int i;
 for( i = 0; p!=NULL&&p->data!=e;i++)
 {
 p=p->next;
 }
if(p==NULL)
 return false;
else return i;
}
bool ListInsert(LinkList *head, int i,int e)//在第I个位置插入元素
{
 LinkList *p=head;
 LinkList *s;
 for(int j = 0;j<i-1&&p!=NULL;j++)
 {
 p=p->next;
 }
 if(p==NULL)
 return false;
 else {
 s=(LinkList*)malloc(sizeof(LinkList));
 s->data = e;
 s->next = p->next;
 p->next = s;
 return true;
 }
}
LinkList *search_node(LinkList *head, int pos)//查找单链表pos位置的节点,返回节点的指针。pos从0开始,0返回head节点
{
    LinkList *p = head->next;
   // if (pos < 0)//pos位置不正确
  //  {
    //    printf("incorrect position to search node!");//pose位置不正确
   //     return NULL;
   // }
    if (pos == 0)
    {
        return head;
    }
   // if (pos == NULL)
   // {
    //    printf("Link is empty!");//链表为空
     //   return NULL;
    //}
    while (--pos)
    {
        if ((p = p->next) == NULL)
        {
            printf("incorrect position to search node!");//超出链表返回
            break;
        }
    }
    return p;
}
bool ListDelete(LinkList *&head,int i,int &e)//删除第I个元素
{
 LinkList *p = head,*q;
 for(int j = 0; j<i-1&&p!=NULL;j++)
 {
 p=p->next;
 }
 if(p==NULL)
return false ;
 else{
 q= p->next;
 if(q==NULL)
 return false;
 e =q->data;
 p->next=q->next;
 free(q);
 return true;
 }
}
int main()
{
LinkList *head;
InitList(*&head);
int n;
printf("请输入元素的个数n:\n");
scanf("%d",&n);
printf("请输入各个元素:\n");
int m;
int a[100];
for(int i = 0;i<n;i++)
{
scanf("%d",&a[i]);
}
CreateListA(*&head,a,n);
DisplayList(*&head); 
printf("元素的个数为:%d\n",ListLength(head));
printf("请输入查找元素的位置s:\n");
int s;
scanf("%d",&s);
 LinkList *search;
    search = search_node(head, s);
    printf("查找链表的第s个数为:%d\n",search->data);
int e,z;
printf("请输入元素插入的位置及元素的值:\n");
scanf("%d %d",&z,&e);
 ListInsert(*&head,z,e);
 DisplayList(*&head);
 int qq;
 printf("请输出删除元素的位置:\n"); 
scanf("%d",&qq);
 int zz;
 ListDelete(*&head,qq,zz);
 DisplayList(*&head);//输出测试
printf("删除的元素为:%d",zz); 
return 0;
}

猜你喜欢

转载自blog.csdn.net/Mr_Qin_AC/article/details/83107399