版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}