功能说明
代码为单链表的相关操作,主要操作为头插法、尾插法建立单链表、查找节点、修改节点、插入节点、删除节点、打印链表数据等功能。代码由头文件(LinkList.h)、接口实现(LinkList.c)和测试文件(main.c)三部分组成。
LinkList.h
#ifndef __LINKLIST__
#define __LINKLIST__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#pragma warning(disable:4996)
typedef struct LNode{
int Data;
struct LNode* Next;
}*LinkList,LNode;
//头插法建立单链表
LinkList CreateListF(LinkList L, int a[], int n);
//尾插法建立单链表
LinkList CreateListR(LinkList L, int a[], int n);
//查找节点
int SearchElem(LinkList L, int e);
//修改节点
LinkList Replace(LinkList L, int p, int e);
//插入节点
LinkList InsertElem(LinkList L, int p, int e);
//删除节点
LinkList DeleteElem(LinkList L, int p, int *e);
//打印链表数据
void PrintfList(LinkList L);
#endif
LinkList.c
#include "LinkList.h"
//头插法
LinkList CreateListF(LinkList L, int a[], int n)
{
LNode *s = NULL;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->Next = NULL;
for (i = 0; i < n; ++i)
{
s = (LNode*)malloc(sizeof(LNode));
s->Data = a[i];
s->Next = L->Next;
L->Next = s;
}
return L;
}
//尾插法
LinkList CreateListR(LinkList L, int a[], int n)
{
LNode *s = NULL, *r= NULL;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->Next = NULL;
r = L;
for (i = 0; i < n; ++i)
{
s = (LNode*)malloc(sizeof(LNode));
s->Data = a[i];
r->Next = s;
r = s;
}
r->Next = NULL;
return L;
}
//查找节点
int SearchElem(LinkList L, int e)
{
LNode* temp = L;
int i = 1, p = 0;
while (temp->Next)
{
temp = temp->Next;
if (temp->Data == e)
{
p = i;
printf("找到了与%d相等的元素,位置为%d\n", e, p);
return 1;
}
++i;
}
printf("抱歉,没有找到所需要的元素!!!\n");
return -1;
}
//修改节点
LinkList Replace(LinkList L, int p, int e)
{
if (L == NULL)
{
return NULL;
}
LNode* temp = L;
int i;
temp = temp->Next;
for (i = 1; i < p; i++)
{
temp = temp->Next;
}
temp->Data = e;
return L;
}
//插入节点
LinkList InsertElem(LinkList L, int p, int e)
{
if (L == NULL)
{
return NULL;
}
LNode * temp = L,*s = NULL;
int i = 0;
while (i < p - 1)
{
temp = temp->Next;
++i;
}
s = (LNode*)malloc(sizeof(LNode));
s->Data = e;
s->Next = temp->Next;
temp->Next = s;
return L;
}
//删除节点
LinkList DeleteElem(LinkList L, int p, int *e)
{
if (L == NULL)
{
return NULL;
}
LNode* temp = L,*q = NULL;
int i = 0;
while (i < p - 1)
{
temp = temp->Next;
++i;
}
q = temp->Next;
*e = q->Data;
temp->Next = q->Next;
free(q);
return L;
}
void PrintfList(LinkList L)
{
LNode* temp = L;
int count = 0;
printf("表中的元素为:\n");
while (temp->Next)
{
temp = temp->Next;
printf("%d\t", temp->Data);
count++;
if (count % 5 == 0)
{
printf("\n");
}
}
printf("\n");
}
main.c
#include "LinkList.h"
int main(int argc, const char* argv[])
{
LinkList L = NULL;
int n,i;
printf("请输入数组的个数: ");
scanf("%d", &n);
int *a = (int *)malloc(sizeof(int)*n);
printf("请输入数组中的数(用空格分开): ");
for (i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
}
L = CreateListF(L, a, n);
PrintfList(L);
int e;
printf("请输入要查找的结点: ");
scanf("%d", &e);
SearchElem(L, e);
int p, k;
printf("请输入要修改的位置和更改后的元素值(用,进行分割):");
scanf("%d,%d", &p, &k);
L = Replace(L, p, k);
PrintfList(L);
printf("请输入要插入的位置和元素值(用,进行分割):");
scanf("%d,%d", &p, &k);
L = InsertElem(L, p, k);
PrintfList(L);
printf("请输入要删除结点的位置:");
scanf("%d,%d", &p);
L = DeleteElem(L, p, &k);
PrintfList(L);
system("pause");
return 0;
}