一.链表的抽象结构体定义
二.链表的基本 *** 作
1.链表的抽象结构体定义
#include
typedef int ElemType;
typedef struct Node{
ElemType data; //数据域
struct Node*next; // 指针域
} Node, *LinkList;
2.初始化链表
/*
* 初始化链表时:
* 应当使头指针== NULL构造一个空链表
*/
int InitiateLinkList() {
LinkList head; //初始化建立一个头指针
head = malloc(sizeof(Node));//动态开辟内存空间
head->next = NULL;
return head;
}
3.基本运算:求表长
int LengthLinkList(LinkList head){
Node *p = head; //p指向头结点
int count = 0; //初始化计数器
while (p->next != NULL){ //遍历链表逐个扫描指针,不为空p指向下一个元素计数器加1
p = p->next;
count++;
}
return count;
}
4-1.基本运算:查找元素(按值查找)
int GetLinkList(LinkList head, int i) {
Node *p; //定义一个用于查找元素工作的指针
p = head->next; //初始化p指向头结点
int index = 1; //初始化位置返回值
/*
* 遍历链表从头结点开始,判断当前结点是否为第i个值,是:则返回该点位置,否:进行遍历表结束为止,若一直否:则返回NULL
*/
while ((index < i) && (p != NULL)) {
p = p->next;
index++;
}
if (index == i) //找到返回该元素的位置
return p;
else //查找失败
return NULL;
}
4-2.基本运算:查找元素(按元素查找)
int LocateLinkList(LinkList head, ElemType edata) {
Node *p = head;
p = p->next;
int i = 0;
/*
* 从链表头结点起,判断当前结点值是否与edata数据相等,是:则返回该点位置 否:继续循环直达找完为止,若表找完还没有找到则返回0
*/
while (p != NULL && p->data != edata) {
i++;
p = p->next;
}
if (p != NULL) //找到
return i+1;
else
return 0;
}
5.基本运算:插入元素
void InsertLinkList(LinkList head, ElemType edata, int i) {
Node *p, *q;
if (i == 1)//若i=1则刚好是表头,直接使新结点q成为头结点即可
q = head;
else
q = GetLinkList(head, i - 1);//查找第i-1个结点
if (q == NULL)
exit("NULL");
else {
p = malloc(sizeof(Node));
p->data = edata;
p->next = q->next;//新结点插入
q->next = p;
}
}
6.基本运算:删除元素
void DeleteLinkList(LinkList head, int i) {
Node *q, *p;
if (i == 1)
q = head;
else
q = GetLinkList(head, i - 1);
if (q != NULL && q->next != NULL) {
p = q->next;
q->next = p->next;
free(p);
} else
exit("NULL");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)