单链表的学习
定义:
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct node
{
ElemType data; /*数据域*/
struct node *next; /*指针域*/
} SLink;
一、初始化
void InitList(SLink *&L) /*L作为引用型参数*/
{
L = (SLink *)malloc(sizeof(SLink)); /*创建头结点*L*/
L->next = NULL;
}
二、链表长度:
int GetLength(SLink *L) /*求线性表的长度*/
{
int i = 0;
SLink *p = L->next;
while (p != NULL)
{
i++;
p = p->next;
}
return i;
}
三、求第 i 个元素:
int GetElem(SLink *L, int i, ElemType &e) /*求线性表中第i个元素*/
{
int j = 1;
SLink *p = L->next;
if (i < 1 || i > GetLength(L))
return (0); /*i参数不正确,返回0*/
while (j < i) /*从第1个结点开始找,查找第i个结点*/
{
p = p->next;
j++;
}
e = p->data;
return (1); /*返回1*/
}
四、按值查找:
int Locate(SLink *L, ElemType x) /*按值查找*/
{
int i = 1;
SLink *p = L->next;
while (p != NULL && p->data != x) /*从第1个结点开始查找data域为x的结点*/
{
p = p->next;
i++;
}
if (p == NULL)
return (0);
else
return (i);
}
五、插入结点:
int InsElem(SLink *L, ElemType x, int i) /*插入结点*/
{
int j = 1;
SLink *p = L, *s;
s = (SLink *)malloc(sizeof(SLink)); /*创建data域为x的结点*/
s->data = x;
s->next = NULL;
if (i < 1 || i > GetLength(L) + 1)
return 0; /*i参数不正确,插入失败,返回0*/
while (j < i) /*从头结点开始找,查找第i-1个结点,由p指向它*/
{
p = p->next;
j++;
}
s->next = p->next; /*将*s的next域指向*p的下一个结点(即第i个结点)*/
p->next = s; /*将*p的next域指向*s,这样*s变成第i个结点*/
return 1; /*插入运算成功,返回1*/
}
六、删除结点:
int DelElem(SLink *L, int i) /*删除结点*/
{
int j = 1;
SLink *p = L, *q;
if (i < 1 || i > GetLength(L))
return 0; /*i参数不正确,插入失败,返回0*/
while (j < i) /*从头结点开始,查找第i-1个结点,由p指向它*/
{
p = p->next;
j++;
}
q = p->next; /*由q指向第i个结点*/
p->next = q->next; /*将*p的next指向*q之后结点,即从链表中删除第i个结点*/
free(q); /*释放第i个结点占用的空间*/
return 1; /*删除运算成功,返回1*/
}
七、输出单链表:
void DispList(SLink *L) /*输出单链表*/
{
SLink *p = L->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("\n");
}
Main:
int main()
{
int i;
ElemType e;
SLink *L;
InitList(L); /*初始化单链表L*/
InsElem(L, 'a', 1); /*插入元素*/
InsElem(L, 'c', 2);
InsElem(L, 'a', 3);
InsElem(L, 'e', 4);
InsElem(L, 'd', 5);
InsElem(L, 'b', 6);
printf("线性表:");
DispList(L);
printf("长度:%d\n", GetLength(L));
i = 3;
GetElem(L, i, e);
printf("第%d个元素:%c\n", i, e);
e = 'a';
printf("元素%c是第%d个元素\n", e, Locate(L, e));
i = 4;
printf("删除第%d个元素\n", i);
DelElem(L, i);
printf("线性表:");
DispList(L);
return 0;
}