链接表首先要建立指针域和数据域,并用本节点的指针域指向下一个节点,对于链表的特点这里不做详细解释
1.建立指针域和数据域
typedef struct Noded{
struct Noded *next;//指针域
int data;//数据域
}Noded;
2.对链表进行初始化,链表为空(确保建立空链表)
//链表初始化
void Init(Noded *head){
head->next = NULL;
}
3.实现链表的各种操作
插入:采用头插法:链表为空时,head指向NULL;链表不为空时,head指向第一个节点,插入时,p的next指向head的next,head的next指向p。
//头插法建立链表
void headInsert(Noded *head,int x){
Noded *p;
p = (struct Noded*)malloc(sizeof(struct Noded));
p->data = x;
p->next = head->next;
head->next = p;
}
得到链表的长度,对链表进行遍历即可
//得到链表长度
int getLen(Noded *head){
Noded *cur = head->next;
int count=0;
while(cur != NULL){
count++;
cur = cur->next;
}
return count;
}
插入:在下标 k 的位置插入,移动链表指针到 k 的位置,进行插入
//在下标为k的位置插入元素 x
void insert(Noded *head, int k, int x){
Noded *cur,*p;
int i;
p = (struct Noded*)malloc(sizeof(struct Noded));
p->data = x;
cur = head;
for(i = 0; i < k; i++) {
cur = cur->next;
}
p->next = cur->next;
cur->next = p;
}
删除:删除下标为 k 的元素,先遍历到 k 位置,再删除即可
//删除下标为 k 的元素
void dele(Noded *head,int k){
Noded *cur = head;
int i;
for(i = 0; i < k; i++){
cur = cur->next;
}
cur->next = cur->next->next;
}
查找:查找元素值为 x 的节点,并返回其下标 ,直接从第一个节点开始遍历,知道找到值为 x 的元素,记录此时已经遍历的元素个数,返回即可。如果链表不存在此元素,则返回-1。
//查找元素值为 x 的节点,并返回其下标
int search(Noded *head,int x){
Noded *cur = head->next;
int i = 0;
while(cur!=NULL){
if(x == cur->data)
return i;
i++;
cur = cur->next;
}
return -1;
}
打印
//打印链表
void print(Noded *head){
if(head==NULL)
return;
Noded *cur = head->next;
while(cur!=NULL){
printf("%d ",cur->data);
cur = cur->next;
}
}
撤销链表
//撤销链表
void destory(Noded *head){
Noded *cur = head->next;
while(cur!=NULL){
free(cur);
cur = cur->next;
}
}
完整代码如下
#include <stdio.h>
#include <stdlib.h>
typedef struct Noded{
struct Noded *next;//指针域
int data;//数据域
}Noded;
//链表初始化
void Init(Noded *head){
head->next = NULL;
}
//头插法建立链表
void headInsert(Noded *head,int x){
Noded *p;
p = (struct Noded*)malloc(sizeof(struct Noded));
p->data = x;
p->next = head->next;
head->next = p;
}
//得到链表长度
int getLen(Noded *head){
Noded *cur = head->next;
int count=0;
while(cur != NULL){
count++;
cur = cur->next;
}
return count;
}
//在下标为k的位置插入元素 x
void insert(Noded *head, int k, int x){
Noded *cur,*p;
int i;
p = (struct Noded*)malloc(sizeof(struct Noded));
p->data = x;
cur = head;
for(i = 0; i < k; i++) {
cur = cur->next;
}
p->next = cur->next;
cur->next = p;
}
//打印链表
void print(Noded *head){
if(head==NULL)
return;
Noded *cur = head->next;
while(cur!=NULL){
printf("%d ",cur->data);
cur = cur->next;
}
}
//删除下标为 k 的元素
void dele(Noded *head,int k){
Noded *cur = head;
int i;
for(i = 0; i < k; i++){
cur = cur->next;
}
cur->next = cur->next->next;
}
//查找元素值为 x 的节点,并返回其下标
int search(Noded *head,int x){
Noded *cur = head->next;
int i = 0;
while(cur!=NULL){
if(x == cur->data)
return i;
i++;
cur = cur->next;
}
return -1;
}
//撤销链表
void destory(Noded *head){
Noded *cur = head->next;
while(cur!=NULL){
free(cur);
cur = cur->next;
}
}
int main(int argc, char *argv[]) {
Noded *node, *node1;
Init(node);
int i;
for(i = 0; i < 7; i++){
headInsert(node,i);
//tailInsert(node,i);
}
print(node);
printf("\n");
insert(node,5,9);
print(node);
//print(node);
printf("\n%d\n",getLen(node));
printf("%d\n",search(node,9));
dele(node,5);
print(node);
}