1.在第i个位置插入元素e(带头结点)
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool LinkList(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
LNode *p;
int j=0;
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;
}
2.在第i个位置插入元素e(不带头结点)
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool LinkList(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
if(i==1)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s-data=e;
s->next=L;
L=s;
return true;
}
LNode *p;
int j=1;
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;
}
3.指定结点的后插操作:在p结点之后插入元素 e
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool InsertNextNode(LNode *p,ELemType e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool LinkList(LinkList &L,int i,ElemType e)
{
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!==NULL && j<i-1)
{
p=p->next;
j++;
}
return InsertNextNode(p,e);
}
4.指定结点的前插操作:在p结点之前插入元素 e
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool InsertPriorNode(LNode *p,ELemType e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
}
5.按位序删除(带头结点)
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool ListDelete(LinkList &L, int i, ElemType &e)
{
if(i<1)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(p=NULL)
return false;
if(p->next==NULL)
return false;
LNode *q = p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
6.指定结点的删除(带头结点)
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool DeleteNode(LNode *p)
{
if(p==NULL)
return false;
LNode *q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
return true;
}
7.按位查找,返回第 i个元素(带头结点)
LNode *GetELem(LinkList L,int i)
{
if(i<0)
return false;
LNode *p;
int j=0;
p=L;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
return p;
}
8.按值查找,找到数据域==e 的结点
LNode *LocateElem(LinkList L,ElemType e)
{
LNode *p = L->next;
while(p!=NULL && p->data != e)
{
p=p->next;
}
return p;
}
9.求表的长度(带头结点)
int length(LinkList L)
{
int len=0;
LNode *p = L;
while(p->next!=NULL)
{
p=p->next;
len++;
}
return len;
}
10.尾插法建立单链表(带头结点)
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
bool InitList(LinkList &L)
{
L = (LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next=NULL;
return true;
}
LinkList List_TailInsert(LinkList &L)
{
int x;
L = (LinkList)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;
return L;
}
void test()
{
LinkList L;
InitList(L);
}
11.头插法建立单链表(带头结点)
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
bool InsertNextNode(LNode *p,Elemtype e)
{
if(p==NULL)
return false;
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s=NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)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);
}
return L;
}
12.双链表的初始化(带头结点)
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode, *DLinkList;
bool InitDLinkList(DLinkList &L)
{
L=(DNode *)malloc(sizeof(DNode));
if(L==NULL)
return false;
L->prior=NULL;
L->next=NULL;
return true;
}
void test()
{
DLinkList L;
InitDLinkList(L);
}
bool Empty(DLinkList L)
{
if(L->next == NULL)
return true;
else
return false;
}
13.双链表的插入(带头结点)
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode, *DLinkList;
bool InsertNextDNode(DNode *p,DNode *s)
{
if(p==NULL || s==NULL)
return false;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
14.双链表的删除(带头结点)
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode, *DLinkList;
bool DeleteNextDNode(DNode *p)
{
if(p==NULL)
return false;
DNode *q=p->next;
if(q==NULL)
return false;
p->next=q->next;
if(q->next=NULL)
q->next->prior=p;
free(q);
return true;
}
void DestoryList(DLinkList &L)
{
while(L->next!=NULL)
{
DeleteNextDNode(L);
}
free(L);
L=NULL;
}
15.双链表的遍历
while(p!=NULL)
{
p=p->next;
}
while(p!=NULL)
{
p=p->prior;
}
while(p->prior != NULL)
{
p=p->prior;
}
16.循环单链表
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next=L;
return true;
}
bool Empty(LinkList L)
{
if(L->next==L)
return true;
else
return false;
}
bool isTail(LinkList L,LNode *p)
{
if(p->next == L)
return true;
else
return false;
}
17.循环双链表
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
bool InitDLinkList(DLinkList &L)
{
L=(DNode *)malloc(sizeof(DNode));
if(L==NULL)
return false;
L->prior=L;
L->next=L;
return true;
}
bool Empty(DLinkList L)
{
if(L->next == L)
return true;
else
return false;
}
bool isTail(DLinkList L,DNode *p)
{
if(p->next==L)
return true;
else
return false;
}
void test()
{
DLinkList L;
InitDLinkList(L);
18.循环双链表的插入
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
bool InsertNextDNode(DNode *p,DNode *s)
{
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
bool DeleteNextDNode(DNode *p)
{
if(p==NULL)
return false;
DNode *q=p->next;
if(q==NULL)
return false;
p->next=q->next;
q->next->prior=p;
free(q);
return true;
}
19.静态链表
#define MaxSize 10
struct Node
{
ElemType data;
int next;
};
typedef struct Node SLinkList[MaxSize];
#define MaxSize 10 /静态链表的最大长度
typedef struct
{
ElemType data;
int next;
}SLinkList[MaxSize];
void testSLinkList()
{
struct Node a;
}
void testSLinkList()
{
struct Node a[MaxSize];
}
20.验证猜想
#include<stdio.h>
#define MaxSize 10
struct Node
{
int data;
int next;
};
typedef struct
{
int data;
int next;
}SLinkList[MaxSize];
void testSLinkList()
{
struct Node x;
printf("sizeX=%d\n",sizeof(x));
struct Node a[MaxSize];
printf("sizeA=%d\n",sizeof(a));
SLinkList b;
printf("sizeB=%d\n",sizeof(b));
}
int main()
{
testSLinkList();
return 0;
}
21.静态链表
#define MaxSize 10
typedef struct
{
ElemType data;
int next;
}SLinkList[MaxSize];
void testSLinkList()
{
SLinkList a;
}
22.按位查找,返回第 i个元素(带头结点)
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LNode *GetElem(LinkList L,int i)
{
if(i<0)
return NULL;
LNode *p;
int j=0;
p=L;
while(p!=NULL && j<i)
{
p=p->next;
j++;
}
return p;
}