数据结构之单链表基本操作——C语言实现
初学数据结构,欢迎批评指正~
#include<stdio.h>
#include<stdlib.h>
#define NULL ((void *)0)
//链表数据结构(带有头结点)
//方法包括:链表的创建,增查删,求链表长度
typedef int ElemType;
//定义结构体
typedef struct node{
ElemType data;
struct node * next;
}Node,*linkList;
//链表的创建,尾插法添加初始数据。
linkList createList(int num){
linkList tail,head,newNode=NULL;
ElemType elem;
head =(linkList)malloc(sizeof(Node));
if(head == NULL){
printf("内存申请失败,头结点创建不成功~");
return NULL;
}
tail = head;
head->next = NULL;
//生成num个元素的链表
for(int i = 0;i < num; i++){
scanf("%d",&elem);
getchar();
newNode = (linkList)malloc(sizeof(Node));
if(newNode == NULL){
printf("内存申请失败,初始化新结点创建不成功~");
return NULL;
}
newNode->data = elem;
newNode->next = NULL;
tail->next = newNode;
tail = tail->next;
}
return head;
}
//链表显示
void showLinkList(linkList L){
linkList temp=L->next;
if(L == NULL){
printf("链表不存在\n");
exit(0);
}
while(temp != NULL){
printf("%d ",temp->data);
temp = temp->next;
}
}
//求链表长度
int linkListLength(linkList L){
linkList temp = L->next;
int length = 0;
while(temp != NULL){
length++;
temp = temp->next;
}
return length;
}
//在链表的第i个位置加一个元素elem,先找到第i-1个元素,然后进行添加操作
void addElement(linkList L,ElemType elem,int i){
linkList newNode,temp = L;
int index = 0;
while(temp != NULL && index < i-1){
temp = temp->next;
index++;
}
if(temp == NULL || index > i-1){
printf("添加元素失败\n");
exit(0);
}
newNode = (linkList)malloc(sizeof(Node));
if(newNode == NULL){
printf("内存申请失败,新结点创建不成功\n");
exit(0);
}
newNode->data = elem;
newNode->next = temp->next;
temp->next = newNode;
}
//在链表中查找第i个元素并取出
ElemType getElem(linkList L,int i){
linkList temp = L->next;
int index = 1;
while(temp != NULL && index < i){
temp = temp->next;
index ++;
}
if(temp != NULL && index == i){
return temp->data;
}
else{
printf("索引位置不合法,查找失败\n");
exit(0);
}
}
//链表删除第i个元素,pre指向第i-1个元素,temp指向第i元素,对i进行删除。
void deleteElem(linkList L,int i){
linkList temp;
linkList pre = L;
int index = 0;
while(pre ->next != NULL&&index < i - 1 ){
pre = pre->next;
index++;
}
if(pre -> next == NULL || index > i - 1 ){
printf("删除失败\n");
exit(0);
}
temp = pre->next;
pre->next = temp->next;
free(temp);
}
int main()
{
int length,index;//长度和索引位置
ElemType elem;//待添加元素
linkList L;
//链表初始化创建
do{
printf("初始化链表长度为:(请输入一个大于0的整数)\n");
scanf("%d",&length);
getchar();
}while(length <= 0);
L = createList(length);
printf("链表长度为%d\n",linkListLength(L));
showLinkList(L);
//检验插入功能
printf("请输入要插入的元素与位置\n");
scanf("%d %d",&elem,&index);
getchar();//消除回车
addElement(L,elem,index);
showLinkList(L);
//检验查找功能
printf("请输入你想查看链表的第几个元素:\n");
scanf("%d",&index);
getchar();
printf("%d\n",getElem(L,index));
//检验删除功能
printf("请输入你想删除链表中的第几个元素:\n");
scanf("%d",&index);
getchar();
deleteElem(L,index);
showLinkList(L);
return 0;
}