顺序表的顺序与链式存储
自己码了一遍两种实现方式的函数模板,都是能直接运行起来的版本。
顺序存储:
#include <stdio.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef int ElemType;
typedef struct LNode *List;
//线性表定义
struct LNode{
ElemType data[MAX_SIZE];
int last;
};
List L;
//访问下标的元素:L->data[i]
//线性表的长度:L->last+1
List makeEmpty(); //初始化顺序表
int find(ElemType x,List L);//查找x出现的下标
void insertList(ElemType x,int i,List L); //下标i处插入x
void deleteList(int i,List L); //删除下标i处的值
ElemType findValue(int k,List L); //返回下标k处的值
void printList(List L);
int length(List L); //返回顺序表长度
List makeEmpty()
{
List L;
L = (List)malloc(sizeof(struct LNode));
L->last = -1;
return L;
}
int find(ElemType x,List L)
{
int i = 0;
while(i <= L->last && L->data[i] != x)
i++;
if(L->last < i) {
return -1; //没找到
}else{
return i; //找到后返回i的下标
}
}
void insertList(ElemType x,int i,List L)
{
int j;
if(L->last == MAX_SIZE-1){
printf("Full\n");
return;
}
if(i<0 || L->last+1 <i){
printf("Out of limit\n");
return;
}
for(j=L->last; j>=i ;j--){
L->data[j+1] = L->data[j];
}
L->data[i] = x;
L->last++;
return;
};
void deleteList(int i,List L)
{
int j;
if(i<0 || L->last <i){
printf("NULL\n");
return;
}
for(j=i;j<=L->last;j++){
L->data[j-1] = L->data[j];
}
L->last--;
return;
};
ElemType findValue(int k,List L)
{
if(k<0 || L->last <k){
printf("NULL\n");
return 0;
}
return L->data[k];
};
int length(List L)
{
return L->last+1;
};
void printList(List L)
{
int i=0;
for(;i<length(L);i++){
printf("%d ",L->data[i]);
}
printf("End\n");
}
int main()
{
int i=0;
L = makeEmpty();
insertList(11,0,L);
printf("L-Data[0] insert 11\n");
insertList(25,1,L);
printf("L-Data[0] insert 25\n");
insertList(33,2,L);
printf("L-Data[0] insert 33\n");
insertList(77,3,L);
printf("L-Data[0] insert 77\n");
printf("List is ");
printList(L);
printf("Find 25's location:%d\n",find(25,L));
printf("Find under2's value:%d\n",findValue(2,L));
deleteList(2,L);
printf("Delete 2nd element\n");
printf("Now List is ");
printList(L);
}
//L-Data[0] insert 11
//L-Data[0] insert 25
//L-Data[0] insert 33
//L-Data[0] insert 77
//List is 11 25 33 77 End
//Find 25's location:1
//Find under2's value:33
//Delete 2nd element
//Now List is 11 33 77 End
链式存储(链表)
#include <stdio.h>
#include <malloc.h>
typedef int elemType;
typedef struct LNode *List;
struct LNode{
elemType data;
List next;
};
List L;
List makeEmpty();
int length(List L); //链表长——遍历
List findTH(int th,List L); //按序号查找
List findValue(elemType x,List L); //按值查找
List insert(elemType x,int i,List L); //将值x插入到第i-1个结点后面
List Delete(int i,List L); //删除第i个结点
void printList(List L); //输出链表结点
List makeEmpty()
{
List L =(List)malloc(sizeof(struct LNode));
L = NULL;
return L;
}
int length(List L)
{
List p = L;
int len = 0;
while(p != NULL){
p = p->next;
len++;
}
return len;
}
List findTH(int th,List L)
{
List p = L;
int i = 1; //序号查找,从1开始
while(p!=NULL && i<th){
p = p->next;
i++;
}
if(i == th){
return p;
}else{
return NULL;
}
}
List findValue(elemType x,List L)
{
List p = L;
while(p!=NULL && p->data != x){
p = p->next;
}
return p;
//找到了:p是这个结点,找不到:p是NULL
};
List insert(elemType x,int i,List L)
{
List p,q;
if(i == 1){
//i=1是新结点
q = (List)malloc(sizeof(struct LNode));
q->data = x;
q->next = L;
return q;
}
p = findTH(i-1,L);//定位第i-1个结点
if(p == NULL){
printf("Error");
return NULL;
}else{
q = (List)malloc(sizeof(struct LNode));
q->data = x;
q->next = p->next;
p->next = q;
return L;
}
};
List Delete(int i,List L)
{
List p,q;
if(i == 1){ //i=1是删除头结点
q = L;
if(L != NULL){
L = L->next;
}else{
return NULL;
}
free(q);
return L;
}
p = findTH(i-1,L);
if(p == NULL || p->next == NULL){ //若i-1或i个结点不存在
printf("error");
return NULL;
}else{
q = p->next;
p->next = q->next;
free(q);
return L;
}
};
void printList(List L)
{
List p;
int flag = 1;
printf("List is ");
for(p = L;p!=NULL;p=p->next){
printf("%d ",p->data);
flag = 0;
}
if(flag != 0){
printf("NULL ");
}
printf("End\n");
};
int main()
{
L = makeEmpty();
L = insert(11,1,L);
insert(25,2,L);
insert(33,3,L);
insert(77,4,L);
printList(L);
printf("List length:%d\n",length(L));
printf("2nd value:%d\n",findTH(2,L)->data);
L = Delete(2,L);
printf("Delete 2nd list:");
printList(L);
}
//List is 11 25 33 77 End
//List length:4
//2nd value:25
//Delete 2nd list:List is 11 33 77 End