最近复习到链表,感觉什么都忘了,指针、二级指针,于是今天下午,按照自己想法就手写了一个带头结点的链表,回忆回忆。里面用到了二级指针,实现了链表初的始化,头插法、尾插法创建链表,在链表的第i个位置插入x的元素,单链表的删除,在链表中删除值为x的元素,遍历链表。
贴码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}Node,*Linkedlist;
//链表初始化
//头插法
//尾插法
//单链表的插入,在链表的第i个位置插入x的元素
//单链表的删除,在链表中删除值为x的元素
//遍历链表
//链表初始化
void initList(Linkedlist* pHead){
Node* p;
p = (Node*)malloc(sizeof(Node));
if(p==NULL){
printf("申请内存空间失败!");
}
else{
p->next=NULL;
printf("创建头结点成功!\n");
*pHead=p;
}
}
//头插法创建链表
void NodeHeadCreate(Linkedlist p){
if(p==NULL){
printf("链表未初始化!");
}
int t;
Node* q;
printf("头插法创建链表:");
while(1){
scanf("%d",&t);
if(t==-1){
break;
}
q = (Node*)malloc(sizeof(Node));
q->next = p->next;
q->data = t;
p->next = q;
}
}
//尾插法创建链表
void NodeRearCreate(Linkedlist p){
if(p==NULL){
printf("链表未被初始化!");
}
int t,d;
Node* rear;
Node* q;
printf("尾插法创建链表:");
while(1){
scanf("%d",&t);
if(t==-1){
break;
}
q = (Node*)malloc(sizeof(Node));
q->data = t;
q->next = NULL;
rear->next = q;
rear = q;
}
}
//单链表的插入,在链表的第i个位置插入x的元素
void LinkedlistInsertNode(Linkedlist pHead,int i,int x){
int k=0;
Node* p;
Node* q;
p=pHead;
while(p->next!=NULL){
k++;
if(k==i){
q = (Node*)malloc(sizeof(Node));
q->next=p->next;
q->data=x;
p->next=q;
break;
}
p=p->next;
}
}
//单链表的删除,在链表中删除值为x的元素
void DeleteLinkedValue(Linkedlist p,int x){
Node* q;
q = p;
int k = 0;
bool flag = false;
while(p->next!=NULL){
if(p->next->data==x){
q = p->next;
p->next=q->next;
free(q);
flag = true;
k++;
}
if(p->next!=NULL){//注意空指针异常,也可以放在前面
p = p->next;
}
}
if(flag){
printf("成功删除节点:%d,并且存在:%d个\n",x,k);
}
else
{
printf("链表中不存在节点:%d\n",x);
}
}
//打印链表
void PrintLinklist(Linkedlist p){
if(p->next!=NULL){
printf("打印链表的值:");
}
while(p->next!=NULL){
p=p->next;
printf("%4d",p->data);
}
printf("\n");
}
int main(){
Linkedlist list;
Node* pHead;
initList(&pHead);
// NodeHeadCreate(pHead);
NodeRearCreate(pHead);
if(pHead->next==NULL){
printf("请按头插法或尾插法创建链表失败!");
}
PrintLinklist(pHead);
//请输入要删除的i值
int i;
printf("请输入要删除的i值:");
scanf("%d",&i);
DeleteLinkedValue(pHead,i);
printf("删除后的链表值为:");
PrintLinklist(pHead);
int j,k;
printf("请输入要在第i个位置插入的值x:");
scanf("%d%d",&j,&k);
LinkedlistInsertNode(pHead,j,k);
printf("插入k值后的链表值为:");
PrintLinklist(pHead);
return 0;
}
本文通过实战演示了单链表的基本操作,包括初始化、头插法、尾插法创建链表、插入和删除节点等,并提供了完整的C语言实现代码。
809

被折叠的 条评论
为什么被折叠?



