一、数据结构
(1) 顺序存储结构
int a[10]
(2)链式存储结构
- typedef struct node
- {
-
elemType element;
-
Node *next;
- }Node;
二、链表的常见操作
(1)插入
- //在第pos个位置前插入元素e
- int ListInsert(LNode *L,int pos,elemType e)
- {
- LNode *p;
- LNode *s=(LNode *)malloc(sizeof(LNode));
- int j=0;
- p=L;
- //printf("在第%d个位置前插入元素%d\n",pos,e);
- while(p&&j<pos-1)
- {
- p=p->Next;
- ++j;
- }
- if(!p||j>pos-1) return ERROR;
- s->data=e;
- s->Next=p->Next;
- p->Next=s;
- return OK;
- }
(2)删除
- //删除第pos个位置上的元素,并返回其值
- int ListDelete(LNode *L,int pos)
- {
- LNode *p=L;
- LNode *q;
- int j=0;
- while(p->Next&&j<pos-1)
- {
- p=p->Next;
- ++j;
- }
- if(j>pos-1||!p->Next)
- return ERROR;
- q=p->Next;
- p->Next=q->Next;
- //printf("删除的元素是:%d\n",q->data);
- free(q);
- return OK;
- }
(3)查找
- //查找函数
- int ListSearch(LNode *L,elemType e)
- {
- LNode *p=L->Next; //头指针指向第一个元素
- int cursor=1;
- while(p->Next!=NULL)
- {
- if(p->data==e)
- {
- printf("找到,%d在第%d个位置\n",e,cursor);
- return cursor;
- }
- p=p->Next;cursor++;
- }//while
- printf("没找到\n");
- }
(4)创建
- //头插建立链表
- void CreatList2(LNode *L,elemType e)
- {
- LNode *s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->Next=L->Next;
- L->Next=s;
- }
- //尾插建立链表
- void CreatList2(LNode *L,elemType e)
- {
- LNode *s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->Next=NULL;
- LNode *p=L;
- while(p->Next!=NULL)
- {
- p=p->Next;
- }
- p->Next=s;
- }
(5)验空
/* 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int
isEmptyList(Node *pHead)
{
if
(pHead == NULL)
{
printf
(
"isEmptyList函数执行,链表为空\n"
);
return
1;
}
printf
(
"isEmptyList函数执行,链表非空\n"
);
return
0;
}
(6)长度计算
/* 5.返回单链表的长度 */
int
sizeList(Node *pHead)
{
int
size = 0;
while
(pHead != NULL)
{
size++;
//遍历链表size大小比链表的实际长度小1
pHead = pHead->next;
}
printf
(
"sizeList函数执行,链表长度 %d \n"
,size);
return
size;
//链表的实际长度
}
(7)反向逆置
- //逆置单向链表
- //通过三个指针遍历 O(n)
- LNode *ListInverse(LNode *L)
- {
- if(L==NULL)
- return NULL;
- if(L->Next==NULL) return L;
- LNode *pre=L->Next;
- LNode *cur=pre->Next;
- LNode *next=cur->Next;
- pre->Next=NULL;
- cur->Next=pre;
- pre=cur;
- cur=next;
- while(cur!=NULL)
- {
- next=cur->Next;
- cur->Next=pre;
- pre=cur;
- cur=next;
- }
- L->Next=pre;
- return L;
- }
//头插法遍历
public void ReversLinkList(LinkList<int> H)
{
Node<int> p = H.Next;
Node<int> q = new Node<int>();
H.Next = null;
while (p != null)
{
q = p;
p = p.Next;
q.Next = H.Next;
H.Next = q;
}
}
//头插法遍历
public void ReversLinkList(LinkList<int> H)
{
Node<int> p = H.Next;
Node<int> q = new Node<int>();
H.Next = null;
while (p != null)
{
q = p;
p = p.Next;
q.Next = H.Next;
H.Next = q;
}
}
(7)正向与反向遍历
- //正向遍历单链表
- void TraverseList(LNode *L)
- {
- LNode *p;
- p=L->Next;
- //printf("线性表La=");
- while(p)
- {
- printf("%d ",p->data);
- p=p->Next;
- }
- printf("\n");
- }
- //逆向遍历单链表
- void f(LNode *L){
- if(L->Next==Null){
- cout<<L->data;
- }
- else{
- f(L->next);
- cout<<L->data;
- }
- }
-