线性表操作代码

线性表各种操作的代码

一.顺序表基本操作

插入操作

#define Maxsize 50
typedef struct SqList
{
	int data[Maxsize];
	int length;
}SqList;
bool ListInsert(SqList &L,int i,int e) //在顺序表L的第i(1<=i<=L.length+1)个位置插入新元素e
{
	if(i<1||i>L.length+1) //判断i的输入是否有效
		return false;
	if(L.length>=Maxsize)
		return false; //空间已满
	for(int j=L.length;j>=i;j--)
	{
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return true;
}

删除操作

bool ListDelete(SqList &L,int i,int &e)//删除第i个位置的元素,被删元素用e返回
{
	if(i<1||i>L.length)
		return false;
	e=L.data[i-1];
	for(int j=i;j<L.length;j++)
		L.data[j-1]=L.data[j];//从前往后前移
	L.length--;
	return true;
}

查找操作

int ListFind(SqList L,int e)//查找第一个元素值等于e的返回位序
{
	int i;
	for(i=0;i<L.length;i++)
		if(L.data[i]==e)
			return i+1;  //下标为i的元素,位序为i+1
	return 0;  //失败返回0
}

线性表逆置问题

void reverse(int a[],int left,int right,int k) //left为最左边下标,right为最右边下标。将前K个元素逆序后移到数组后端
{
	int temp,i,j;
	for(i=left,j=right;i<left+k&&i<j;i++,j--)
	{
		temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}
}

二.单链表基本操作

创建链表

#include<stdlib.h>
#include<stdio.h>
typedef struct LNode
{
  int data;
  struct LNode *next;
}LNode,*LinkList;

LinkList List_HeadInsert(LinkList &L) //头插法建立单链表
{
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode)); //头节点
	L->next=NULL;
	scanf("%d",&x);
	while(x!=999) //输入999表示结束
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next=s; //新结点插入表中,L为头指针
		scanf("%d",&x);
	}
	return L;
}

LinkList List_TailInsert(LinkList &L) //尾插法建立单链表
{
	L=(LinkList)malloc(sizeof(LNode)); //头节点
	LNode *s,*r=L;//r为表尾指针
	int x;

	scanf("%d",&x);
	while(x!=999) //输入999表示结束
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL; //尾结点指针置空
	return L;
}

按序号查找

LNode *GetElem(LinkList L,int i)//按序号查找第i个结点
{
	int j=1;//计数,初始为1
	LNode *p=L->next; //p指向第一个结点
	if(i==0)
		return L; //i=0返回头结点
	if(i<1)
		return NULL; //无效
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	return p; //返回第i个结点的指针,若i大于表长就返回NULL
}

按值查找

LNode *LocateElem(LinkList L,int e)//按值查找
{
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
	}
	return p; //找到后返回该结点否则返回NULL
}

插入

//插入结点,将值为x的结点s插入到第i个位置上
LNode *p;
p=GetElem(L,i-1); //找到插入位置的前驱结点
s->next=p->next;
p->next=s;

删除

//删除结点
//删除第i个结点
p=GetElem(L,i-1);//找前驱
q=p->next;//待删除结点
p->next=q->next;
free(q);

选择排序

void SelectSort(pLinkList pList)//选择排序单链表
{
	pLinkNode p = NULL;
	pLinkNode q = NULL;
	for(p = pList ->pHead ;p!=NULL; p = p->next )
	{
		//注意:q = p->next 外循环进来每次向后挪动一个;
		for(q = p->next;q!=NULL; q = q->next )//找最小的结点
		{
			if(p->data > q->data )//只要大就交换,改变的只是data
			{
				DataType tmp = q->data ;
				q->data  = p->data ;
				p->data = tmp;
			}
		}//第一次内层循环结束后,就已经将最小的放入第一个节点的data 中了;
		 //以此类推;
	}
}

冒泡排序

int lenList(node *head)
{
	if (head == NULL)
		return 0;
	node *p = head;
	int len = 0;
	while(p != NULL)
	{
		len++;
		p = p->next;
	}
	return len;
}
 
void sortList(node *head)
{
	int len = lenList(head);
	cout << "len:" << len << endl;
	if (len == 0)
		return;
	node *p = head;
	int i, j, tmp;
	for (i = 0; i < len - 1; i++)
	{
		p = head;
		for (j = 0; j < len -i -1; j++)
		{
			if (p->data > p->next->data)
			{
				tmp = p->data;
				p->data = p->next->data;
				p->next->data = tmp;	
			}
			p = p->next;
		}
	}
}


插入排序(交换结点)

void sort(stu head)  //链表的插入排序
{
	stu curr,pre,p,q;
	p=head->next;//工作指针
	head->next=NULL;
	while(p!=NULL)
	{
		curr=head->next;
		pre=head;
		while(curr!=NULL&&curr->data<=p->data)  //找到p要插入的位置,即大于p的结点的前面
		{
			pre=curr; //后移
			curr=curr->next;
		}
		q=p; //q指向要插入的结点
		p=p->next;//工作结点后移
		q->next=pre->next;
		pre->next=q;
	}
}

冒泡排序(交换结点)

void sortlist(linklist head)//对链表进行bubble sort
{
    linklist pre, p,tail;
    tail = NULL;
    while (head->next != tail)
    {
        pre = head;
        p = head->next;
        while (p->next!=tail)
        {
            if (p->data > p->next->data)
            {
                pre->next = p->next;
                p->next = pre->next->next;
                pre->next->next = p;
            }
            else
                p = p->next;
            pre = pre->next;
        }
        tail = p;
    }
}

三.双链表基本操作

插入

typedef struct DNode{
	int data;
	struct DNode *prior,*next;
}DNode,*DLinklist;

//双链表插入
//将s插入在p后面
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;

删除

//双链表删除
//删除p的后继结点q
p->next=q->next;
q->next->prior=p;
free(q);
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值