线性表学习

顺序表

顺序表,即线性表的顺序存储结构,采用结构体类型SqList表示为:

1
2
3
4
struct sqList{
ElementType data[maxSize];
int length;
}

顺序表的实现

建立顺序表

1
2
3
4
5
6
7
sqList *L=(sqList *)malloc(sizeof(sqList));
L->length=0;int i=0;
while(i<n)
{
scanf("%d",&L->data[i]);
L->length++;
}

查找顺序表数据位置

1
2
3
4
5
6
7
8
void search(sqList* L,int e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>L-length) return 0;
else return i+1;
}

插入数据元素

1
2
3
4
5
6
7
8
9
10
11
void sert(sqList *L,int i,int e)
{
int j=L->length;
while(j>i)
{
L->data[j]=L->data[j-1];
j--;
}
L->data[i-1]=e;
L->length++;
}

删除顺序表

free(L);

顺序表的应用

题目大意

给定一个顺序表,删除其中所有值等于x的元素,要求时间复杂度O(N),空间复杂度O(1)

代码

1
2
3
4
5
6
7
8
9
10
11
12
void deleteX(sqList *L,int x)
{
int i=0,k=0;
while(i<L->length)
{
if(L->data[i]==x) i++;
L->data[k]=L->data[i];
k++;i++;
}
L->length=k;
for(i=0;i<L->length;i++) printf("%d ",L->data[i]);
}

链表

链表,即线性表的链式存储结构,采用结构体的表示方式为:

1
2
3
4
struct nodeList{
int data;
nodeList *next;
}

链表的实现

链表的建立

1.头插法

1
2
3
4
5
6
7
8
9
10
11
nodeList *p,*q;
p=(nodeList *)malloc(sizeof(nodeList));
p->next=NULL;
int x;
while(~scanf("%d",&x)
{
q=(nodeList *)malloc(sizeof(nodeList));
q->data=x;
q->next=p->next;
p->next=q;
}

2.尾插法

1
2
3
4
5
6
7
8
9
10
11
12
nodeList *head,*p,*q;
head=(nodeList *)malloc(sizeof(nodeList));
p=head;
int x;
while(~scanf("%d",&x))
{
q=(nodeList *)malloc(sizeof(nodeList));
q->data=x;
p->next=q;
p=q;
}
p->next=NULL;

链表的插入元素与删除元素

1.插入元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void sertElement(nodeList *L,int i,int e)
{
nodeList *p=L;
int j=0;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
if(p!=NULL)
{
nodeList *s=(nodeList*)malloc(sizeof(nodeList));
s->data=e;
s->next=p->next;
p->next=s;
}
}

2.删除元素

1
2
3
4
5
6
7
8
9
10
11
12
void deleteElement(nodeList *L,int e)
{

nodeList *p=L,*q;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
q=p->next;
p->next=p->next->next;
free(q);
}

链表的删除

1
2
3
4
5
6
7
8
9
10
11
void freeList(nodeList *L)
{
nodeList *q=L,*p=L->next;
while(q!=NULL)
{
free(q);
q=p;
p=q->next;
}
free(q);
}

链表的应用

题目大意

给定一个链表,设计一个算法使其元素递增。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void sortList(nodeList *head)
{
nodeList *q,*p,*s;
q=head->next;p=head->next->next;
s=head;
while(q!=NULL)
{
while(q->data>=p->data)
{
p=p->next;
}
q->next=p->next;p->next=q;
p=head->next;
q=q->next
}