1.顺序表
#include <stdio.h>
#define MaxSize 100
#define ElemType int
typedef struct{
ElemType data[MaxSize];
int length;
}SqList;
void InitList(SqList &L);//初始化顺序表
bool ListInsert(SqList &L,int i, ElemType e);//插入操作,向顺序表L的第i个位置插入元素e
bool ListDelete(SqList &L,int i, ElemType &e);//删除操作,删除顺序表L的第i个元素并,并将删除的值赋给e
int LocateElem(SqList L, ElemType e);//按值查找,返回下标
void PrintList(SqList L);//输出顺序表
int main()
{
SqList L;
ElemType e;
InitList(L);
for(int i=0;i<10;i++){
ListInsert(L,i+1,i);
}
ListDelete(L, 2, e);
PrintList(L);
return 0;
}
void InitList(SqList &L){
L.length = 0;
}
bool ListInsert(SqList &L,int i, ElemType e){
int j;
if(i<=0 || i>L.length+1)
return false;
for(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, ElemType &e){
int j;
if(i<1 || i>L.length)
return false;
e = L.data[i-1];
for(j = i; j<L.length; j++){
L.data[j-1] = L.data[j];
}
L.length--;
return true;
}
int LocateElem(SqList L, ElemType e){
int i;
if(L.length==0)
return -1;
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
return i+1;
}
return -1;
}
void PrintList(SqList L){
int i;
for(i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
}
2.链表
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
bool InitList(LinkList &L);//初始化链表
int length(LinkList L);//求链表长度
LNode *GetElem(LinkList L,int i);//求第i个元素的节点
LNode *LocateElem(LinkList L,int e);//求元素e的节点
bool ListInsert(LinkList &L,int i,int e);//在第i个位置插入值为e的节点
bool ListDelete(LinkList &L,int i,int &e); //删除第i个位置的节点,并将值赋给e
void List_HeadInsert(LinkList &L);//头插法建立单链表
void List_TailInsert(LinkList &L);//尾插法建立单链表
void PrintList(LinkList L);//输出单链表
int main(){
int x;
LinkList L;
InitList(L);
List_TailInsert(L);
printf("尾插法建立的单链表:");
PrintList(L);
ListInsert(L,1,8);
printf("插入操作后的单链表:");
PrintList(L);
ListDelete(L,2,x);
printf("删除操作后的单链表:");
PrintList(L);
printf("删除的元素是:%d",x);
return 0;
}
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
return true;
}
int length(LinkList L){
int len=0;
LNode *p=L;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
LNode *GetElem(LinkList L,int i){
int j=0;
LNode *p=L;
while(p->next != NULL && j<i){
p = p->next;
j++;
}
return p;
}
LNode *LocateElem(LinkList L,int e){
LNode *p = L;
while(p->next != NULL && p->data!=e){
p = p->next;
}
return p;
}
bool ListInsert(LinkList &L,int i,int e){
int j=0;
LNode *p = L;
while(p != NULL && j<i-1){
p = p->next;
j++;
}
if(p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
bool ListDelete(LinkList &L,int i,int &e){
int j=0;
LNode *p = L;
while(p->next !=NULL && j<i-1){
j++;
p = p->next;
}
if(p->next==NULL)
return false;
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
void List_HeadInsert(LinkList &L){
int x;
LNode *s;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x!=9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
}
void List_TailInsert(LinkList &L){
int x;
L = (LNode *)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d", &x);
while(x!=9999){
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
}
void PrintList(LinkList L){
LNode *p = L;
while(p->next != NULL){
p = p->next;
printf("%d ", p->data);
}
printf("\n");
}
3.如果是双链表
1.声明
typedef struct LNode{
ElemType data;
struct LNode *prior,*next;
}DNode, *DinkList;
2.操作
双链表的基本操作和单链表基本相似,只有插入操作和删除操作差别较大
bool ListInsert(DinkList &L,int i,int e){
int j=0;
DNode *p = L;
while(p != NULL && j<i-1){
p = p->next;
j++;
}
if(p == NULL)
return false;
DNode *s = (DNode *)malloc(sizeof(DNode));
s->data = e;
s->next = p->next;
if(p->next != NULL)
p->next->prior = s;
p->next = s;
s->prior = p;
return true;
}
bool ListDelete(DinkList &L,int i,int &e){
int j=0;
DNode *p = L;
while(p->next !=NULL && j<i-1){
j++;
p = p->next;
}
if(p->next==NULL)
return false;
DNode *q = p->next;
e = q->data;
p->next = q->next;
if(q->next != NULL)
q->next->prior = p;
free(q);
return true;
}