一切为了:
Merge
1.《大话数据结构》
1.个人感觉,这一块《大话数据结构》作者搞的略混。代码也有少许我不赞成的地方,会在之后的工作中,改正我认为不完美的地方。
2.毕竟现在不是大师,改正过程中我会以实际运行为标准,并且查阅相关的大牛们编著的书籍。
3.正如我开头所说一切为了Merge,形成自己的知识体系才是重要的。
1.单链表
有时为了方便,第一个结点设头结点,可以存储线性表长度等附加信息
头指针头结点的异同:
/*线性表单链表存储结构---C实现*/
typedef struct Node
{
ElemType data; //注意这里的ElemType
struct Node *next;
} Node;
typedef struct Node *LinkList;
2.单链表的读取
算法思路:
- 声明一个结点p指向链表第一个结点,初始化j从1开始
- 当j
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p;
p = L->next;
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if( !p || j>i)
return ERROR;
*e = p->data;
return OK;
}
3.单链表的插入与删除
插入结点的算法思路
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while( p && j<i)
{
p = p->next;
++j;
}
if( !p || j>i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
这段代码要注意的是s->next = p->next; p->next = s; 这两个的顺序。
删除操作
实际要做:p->next = p->next->next
算法思路:
Status ListDelete(LinkList *L,int i;ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while(p->next &&j<i)
{
p = p->next;
++j;
}
if(!(p->next) || j>i)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return OK;
}
4. 单链表的整表创建
/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/
void CreateListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0)); //初始化随机数种子
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for(i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1
p->next = (*L)->next;
(*L)->next = p;
}
}
/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/
void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0));
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for(i=0;i<n;i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand()%100+1;
r->next = p;
r = p;
}
r->next = NULL;
}
5.单链表的整表删除
算法思路:
Status ClearList(LinkList *L)
{
LinkList p,q;
p = (*L)->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return OK;
}
6.总结
单链表结构与顺序存储结构: