#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
//进行尾插操作;(正向插入,此方法有有头节点)
LinkList TailInsert(LinkList &L,int a[],int n)
{
L=(LinkList)malloc(sizeof(LNode));//建立一个头节点
LNode *s;//建立一个插入结点
LNode *r=L;//建立一个尾结点
for(int i=0;i<n;i++)
{
s = (LNode*)malloc(sizeof(LNode));//每次都要创建一个结点
s->data = a[i];
r->next = s;
r = s;//将r指向新的表尾结点
}
r->next = NULL;//尾指针设为空
return L;
}
//对某一结点进行前插操作,在P结点插入元素e
Status FormInsert(LinkList &L,LNode *p,Elemtype e)
{
int temp;
if(p==NULL)
{
return false;
}
LNode *s;//建立一个插入结点指针。
s = (LNode*)malloc(sizeof(LNode));
if(s == NULL)//内存分配失败
{
return false;
}
//第一种方法,每循环遍历链表,找到p结点的前驱结点,但是时间复杂度为O(n)
/*
LNode *q;//建立一个循环结点指针。
q = (LNode*)malloc(sizeof(LNode));
q = L->next;
while(q != NULL && q->next != p)
{
q = q->next;
}
if(q == NULL)
{
return false;
}
s->data = e;
s->next = p;
q->next = s;
*/
//第二种方法,先转换为后插,再交换两个结点的数据域,其时间复杂度为O(1)。
s->next = p->next;
p->next = s;
temp = p->data;
p->data = e;
s->data = temp;
return true;
}
//取出链表中的第i个位置上的结点
LNode *LocateElem(LinkList L,int i)
{
int j = 1;
LNode *p = L->next;
if(i ==0)
{
return L;
}
if( i<0 )
{
return NULL;
}
while(p != NULL && j<i)
{
p = p->next;
j++;
}
return p;
}
//删除某节点前的结点
Status DeleteList(LinkList &L,LNode *p)
{
//第一种方法通过循环遍历,时间复杂度为O(n),但可以正确删除最后一个结点。
LNode *q;//建立一个循环结点指针。
q = (LNode*)malloc(sizeof(LNode));
q = L->next;
while(q != NULL && q->next != p)
{
q = q->next;
}
if(q == NULL)
{
return false;
}
q->next = p->next;
free(p);
return true;
//第二种方法,通过交换数字,从而进行删除操作,但是不能删除最后一个结点;
/*
LNode *q;
q = (LNode*)malloc(sizeof(LNode));
q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
return true;
*/
}
//输出链式表
void printList(LinkList L)
{
LNode *p;//定义一个结点指针
p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//主函数
int main()
{
LinkList L;
LNode *p;
int a[10];
int m,n,i;
printf("输入数组的个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
TailInsert(L,a,n); //尾插法
printf("插入后的单链表为:\n");
printList(L);
//按位序查找
printf("输入你要查找的位序:");
scanf("%d",&i);
p = LocateElem(L,i);
if(p)
{
printf("找到位序%d的值为%d\n",i,p->data);
/*
if(FormInsert(L,p,1111))
{
printf("前插后的单链表为:\n");
printList(L);
}
*/
if(DeleteList(L,p))
{
printf("删除该点后的单链表为:\n");
printList(L);
}
}
else
{
printf("没有找到。\n");
}
}
单链表的基本操作(二)
最新推荐文章于 2024-07-08 21:10:38 发布