(1) 用头插法或尾插法建立带头结点单链表
(2) 实现单链表的插入、删除、查找、遍历、排序等基本操作
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node* pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node,*PNODE 等价于struct Node *
PNODE creat_list();//创建单链表,并返回该链表的头指针
void traverse_list(PNODE pHead);//遍历单链表
int is_empty(PNODE pHead);//判读单链表是否为空
int insert_list(PNODE pHead, int pos, int val);
//在pHead所指向的第pos个节点的前面插入一个新节点,值(数据域)为val,并且pos从1开始
PNODE create_list_head();//头插法
int delete_list(PNODE pHead, int pos, int* pVal);
//删除链表的第pos个节点,并将删除的节点的值存到pVal所指的变量中,pos的值从1开始
int length_list(PNODE pHead);//求表长度
void sort_list(PNODE pHead);//排序
int main(void)
{
int val = 0;//保存被删节点的数据值
PNODE pHead = NULL;//定义头指针,等价于struct Node *pHead = NULL
//创建单链表
pHead=creat_list();
//遍历链表
traverse_list(pHead);
insert_list(pHead, 2, 28);
traverse_list(pHead);
delete_list(pHead, 4, &val);
printf("被删元素的值为:%d\n", val);
traverse_list(pHead);
printf("表长为:%d\n", length_list(pHead));
sort_list(pHead);
traverse_list(pHead);
}
PNODE creat_list()
{
PNODE pNew;
int len;//用来存放有效节点的个数
int i;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点
if (pHead == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;//尾指针,开始指向头节点
pTail->pNext = NULL;
printf("请输入要生成的链表节点个数:len= ");
scanf_s("%d", &len);//获取用户输入的len值
for (i = 0; i < len; i++)
{
printf("请输入第%d个节点的值: ", i + 1);
scanf_s("%d", &val);
pNew = (PNODE)malloc(sizeof(NODE));//申请新节点,分配空间
if (pNew == NULL)
{
printf("空间分配失败,程序终止\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;//新节点挂到pTail的next域
pNew->pNext = NULL;
pTail = pNew;//使得pTail始终指向尾结点
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;//p指向首节点(头节点的后面一个节点)
while (p != NULL)
{
printf("%d ", p->data);
p = p->pNext;//顺链操作
}
printf("\n");
return;
}
int is_empty(PNODE pHead)
{
if (pHead->pNext == NULL)
return 1;//1表示为空表
else
return 0;//0表示不是空表
}
int insert_list(PNODE pHead, int pos, int val)
{
PNODE p = pHead;
int i = 0;
PNODE pNew;
while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
{
p = p->pNext;
i++;
}
if (i > pos - 1 || p == NULL)
return 0;//0表示插入失败
pNew = (PNODE)malloc(sizeof(NODE));//表示要插入的节点
if (pNew == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
printf("插入成功!\n");
return 1;//1表示插入成功
}
PNODE create_list_head()//头插法,逆序
{
int len;
int i;
int val;
PNODE p;
PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点。
if (pHead == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
pHead->pNext = NULL;
printf("请输入要生成的链表节点的个数:len=");
scanf_s("%d", &len);//获取用户输入的len的值
for (i = len; i > 0; i--)
{
printf("请输入第%d个节点的值: ", i);
scanf_s("%d", &val);
p = (PNODE)malloc(sizeof(NODE));
if (p == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
p->data = val;
p->pNext = pHead->pNext;
pHead->pNext = p;
}
return pHead;
}
int delete_list(PNODE pHead, int pos, int* pVal)
{
int i = 0;
PNODE p = pHead;
PNODE q;//q记录被删节点
while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
{
p = p->pNext;//顺链
i++;
}
if (i > pos - 1 || p->pNext == NULL)
return 0;//0表示删除失败
q = p->pNext;
*pVal = q->data;//保存被删除节点的数据域
p->pNext = p->pNext ->pNext;
free(q);
return 1;//1表示删除成功
}
int length_list(PNODE pHead)//求表头(不算头节点)
{
int len = 0;
PNODE p = pHead->pNext;//p指向了首节点
while (p != NULL)
{
len++;
p = p->pNext;
}
return len;
}
void sort_list(PNODE pHead)
{
int len = length_list(pHead);//求表长
PNODE p, q;
int j, t,i;
for (i=0,p = pHead->pNext; i < len - 1;i++, p = p->pNext)
{
for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node* pNext;//指针域
}NODE,*PNODE;//NODE等价于struct Node,*PNODE 等价于struct Node *
PNODE creat_list();//创建单链表,并返回该链表的头指针
void traverse_list(PNODE pHead);//遍历单链表
int is_empty(PNODE pHead);//判读单链表是否为空
int insert_list(PNODE pHead, int pos, int val);
//在pHead所指向的第pos个节点的前面插入一个新节点,值(数据域)为val,并且pos从1开始
PNODE create_list_head();//头插法
int delete_list(PNODE pHead, int pos, int* pVal);
//删除链表的第pos个节点,并将删除的节点的值存到pVal所指的变量中,pos的值从1开始
int length_list(PNODE pHead);//求表长度
void sort_list(PNODE pHead);//排序
int main(void)
{
int val = 0;//保存被删节点的数据值
PNODE pHead = NULL;//定义头指针,等价于struct Node *pHead = NULL
//创建单链表
pHead=creat_list();
//遍历链表
traverse_list(pHead);
insert_list(pHead, 2, 28);
traverse_list(pHead);
delete_list(pHead, 4, &val);
printf("被删元素的值为:%d\n", val);
traverse_list(pHead);
printf("表长为:%d\n", length_list(pHead));
sort_list(pHead);
traverse_list(pHead);
}
PNODE creat_list()
{
PNODE pNew;
int len;//用来存放有效节点的个数
int i;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点
if (pHead == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;//尾指针,开始指向头节点
pTail->pNext = NULL;
printf("请输入要生成的链表节点个数:len= ");
scanf_s("%d", &len);//获取用户输入的len值
for (i = 0; i < len; i++)
{
printf("请输入第%d个节点的值: ", i + 1);
scanf_s("%d", &val);
pNew = (PNODE)malloc(sizeof(NODE));//申请新节点,分配空间
if (pNew == NULL)
{
printf("空间分配失败,程序终止\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;//新节点挂到pTail的next域
pNew->pNext = NULL;
pTail = pNew;//使得pTail始终指向尾结点
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;//p指向首节点(头节点的后面一个节点)
while (p != NULL)
{
printf("%d ", p->data);
p = p->pNext;//顺链操作
}
printf("\n");
return;
}
int is_empty(PNODE pHead)
{
if (pHead->pNext == NULL)
return 1;//1表示为空表
else
return 0;//0表示不是空表
}
int insert_list(PNODE pHead, int pos, int val)
{
PNODE p = pHead;
int i = 0;
PNODE pNew;
while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
{
p = p->pNext;
i++;
}
if (i > pos - 1 || p == NULL)
return 0;//0表示插入失败
pNew = (PNODE)malloc(sizeof(NODE));//表示要插入的节点
if (pNew == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
printf("插入成功!\n");
return 1;//1表示插入成功
}
PNODE create_list_head()//头插法,逆序
{
int len;
int i;
int val;
PNODE p;
PNODE pHead = (PNODE)malloc(sizeof(NODE));//向系统申请空间,表示头节点。
if (pHead == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
pHead->pNext = NULL;
printf("请输入要生成的链表节点的个数:len=");
scanf_s("%d", &len);//获取用户输入的len的值
for (i = len; i > 0; i--)
{
printf("请输入第%d个节点的值: ", i);
scanf_s("%d", &val);
p = (PNODE)malloc(sizeof(NODE));
if (p == NULL)
{
printf("空间分配失败,程序终止!\n");
exit(-1);
}
p->data = val;
p->pNext = pHead->pNext;
pHead->pNext = p;
}
return pHead;
}
int delete_list(PNODE pHead, int pos, int* pVal)
{
int i = 0;
PNODE p = pHead;
PNODE q;//q记录被删节点
while (p != NULL && i < pos - 1)//循环结束时,p指向的是第pos-1个节点
{
p = p->pNext;//顺链
i++;
}
if (i > pos - 1 || p->pNext == NULL)
return 0;//0表示删除失败
q = p->pNext;
*pVal = q->data;//保存被删除节点的数据域
p->pNext = p->pNext ->pNext;
free(q);
return 1;//1表示删除成功
}
int length_list(PNODE pHead)//求表头(不算头节点)
{
int len = 0;
PNODE p = pHead->pNext;//p指向了首节点
while (p != NULL)
{
len++;
p = p->pNext;
}
return len;
}
void sort_list(PNODE pHead)
{
int len = length_list(pHead);//求表长
PNODE p, q;
int j, t,i;
for (i=0,p = pHead->pNext; i < len - 1;i++, p = p->pNext)
{
for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}