方法一: 直接使用指针的指针来保存头指针L,不使用函数返回头结点的指针 使用指针的指针目的是保存单链表头指针 (只要找到单链表的头指针,就能找到整个单链表)
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void InitList(LinkList* L)
{
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
void CreateLinkList_Head(LinkList* L, int n)
{
LNode* p;
for (int i=0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkList_Rear(LinkList *L, int n)
{
LNode *p,*r;
r = *L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
}
int main()
{
LinkList L;
InitList(&L);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
CreateLinkList_Head(&L, n);
printf("打印的链表为:\n");
PrintLinkList(L);
return 0;
}
头插法
尾插法
方法二: 直接用函数返回单链表的头指针,以便保存单链表头指针 (只要找到单链表的头指针,就能找到整个单链表)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
LinkList InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(LinkList));
L->next = NULL;
return L;
}
LinkList CreateLinkList_Head(LinkList L, int n)
{
LNode* p;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
return L;
}
LinkList CreateLinkList_Rear(LinkList L, int n)
{
LNode* p, * r;
r = L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
return L;
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
}
int main()
{
LinkList l;
l = (LinkList)malloc(sizeof(LinkList));
l=InitList(l);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
l=CreateLinkList_Head(l, n);
printf("打印的链表为:\n");
PrintLinkList(l);
return 0;
}
头插法
尾插法
获取链表第 i 个位置元素
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void InitList(LinkList* L)
{
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
void CreateLinkList_Head(LinkList* L, int n)
{
LNode* p;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkList_Rear(LinkList* L, int n)
{
LNode *p,*r;
r = *L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
int GetElem(LinkList L, int i, ElemType* e)
{
LNode* p;
p = L->next;
int j=0;
while (p!=NULL && j<i)
{
p = p->next;
j++;
}
*e = p->data;
return *e;
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(&L);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
CreateLinkList_Rear(&L, n);
printf("打印的链表为:");
PrintLinkList(L);
int i;
ElemType e;
printf("输入要获取元素的位置:");
scanf("%d",&i);
e=GetElem(L, i-1, &e);
printf("元素内容为:%d",e);
return 0;
}
获取链表第 i 个位置的元素
根据寻找输入元素在链表中的位置
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void InitList(LinkList* L)
{
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
void CreateLinkList_Head(LinkList* L, int n)
{
LNode* p;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkList_Rear(LinkList* L, int n)
{
LNode *p,*r;
r = *L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
int GetNum(LinkList L, ElemType e)
{
LNode* p;
p = L->next;
int i=0;
while (p != NULL && p->data != e)
{
p = p->next;
i++;
if ( p!=NULL && p->data == e)
return i;
}
if (p == NULL) {
return 0;
}
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(&L);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
CreateLinkList_Rear(&L, n);
printf("打印的链表为:");
PrintLinkList(L);
int i;
ElemType e;
printf("输入要查询的元素:");
scanf("%d",&e);
i = GetNum(L, e);
if (i==0)
printf("未找到该元素");
else
printf("元素对应的位置:%d",i+1);
return 0;
}
根据寻找输入元素在链表中的位置
在指定位置插入元素
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void InitList(LinkList* L)
{
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
void CreateLinkList_Head(LinkList* L, int n)
{
LNode* p;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkList_Rear(LinkList* L, int n)
{
LNode *p,*r;
r = *L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void LinkListInsert(LinkList *L, int i, ElemType e)
{
int j=0;
LNode *p,*s;
s = (LNode*)malloc(sizeof(LNode*));
s->data = e;
p = (*L);
while (p!=NULL && (j<i-1) )
{
p = p->next;
j++;
}
s->next = p->next;
p->next = s;
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(&L);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
CreateLinkList_Rear(&L, n);
printf("打印的链表为:");
PrintLinkList(L);
int i;
ElemType e;
printf("请输入要插入元素的内容(整数):");
scanf("%d", &e);
printf("请输入要插入的位置(整数):");
scanf("%d", &i);
LinkListInsert(&L,i,e);
printf("插入后的链表为:");
PrintLinkList(L);
return 0;
}
在指定位置前插入元素
删除单链表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LNode, * LinkList;
void InitList(LinkList* L)
{
*L = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
}
void CreateLinkList_Head(LinkList* L, int n)
{
LNode* p;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateLinkList_Rear(LinkList* L, int n)
{
LNode *p,*r;
r = *L;
for (int i = 0; i < n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
printf("输入结点的数据(整数):");
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void LinkListDelete(LinkList L)
{
LNode *p,*q;
p = L;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free(q);
}
}
void PrintLinkList(LinkList L)
{
LNode* p;
p = L->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(&L);
int n;
printf("需要为该单链表输入结点个数:");
scanf("%d", &n);
CreateLinkList_Rear(&L, n);
printf("打印的链表为:");
PrintLinkList(L);
LinkListDelete(L);
printf("删除后的链表为:");
PrintLinkList(L);
return 0;
}
删除单链表
|