线性表各种操作的代码
一.顺序表基本操作
插入操作
#define Maxsize 50
typedef struct SqList
{
int data[Maxsize];
int length;
}SqList;
bool ListInsert(SqList &L,int i,int e)
{
if(i<1||i>L.length+1)
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)
{
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)
{
int i;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
线性表逆置问题
void reverse(int a[],int left,int right,int 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)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
int x;
scanf("%d",&x);
while(x!=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)
{
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p&&j<i)
{
p=p->next;
j++;
}
return p;
}
按值查找
LNode *LocateElem(LinkList L,int e)
{
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
插入
LNode *p;
p=GetElem(L,i-1);
s->next=p->next;
p->next=s;
删除
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 )
{
for(q = p->next;q!=NULL; q = q->next )
{
if(p->data > q->data )
{
DataType tmp = q->data ;
q->data = p->data ;
p->data = tmp;
}
}
}
}
冒泡排序
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)
{
pre=curr;
curr=curr->next;
}
q=p;
p=p->next;
q->next=pre->next;
pre->next=q;
}
}
冒泡排序(交换结点)
void sortlist(linklist head)
{
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->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
删除
p->next=q->next;
q->next->prior=p;
free(q);