1、单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
链表中的数据是以节点来表示的,每个结点的构成:元素( 数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2、下面附上自己实现的代码,欢迎大家批评
特别说明:对于链表的逆序,实现思路是头插法实现反转
typedef int typedata;
//构造链表结构
typedef struct list
{
typedata data; //数据域
struct list* Next; //指针域
}List; //LIST == struct list
//创建一个链表
List *creatList(int n)
{
List *head; //定义头、普通、尾结点
int i;
head = (List *)malloc(sizeof(List));
List *h = head; //遍历链表
//int n;
for(i = 0; i < n; i++)
{
List *node = (List *)malloc(sizeof(List));
node->data = i;
node->Next = NULL; //尾结点的指针域置空
h->Next = node;
h = h->Next; //指针后移
}
return head;
}
//插入元素
List *inserList(List *head, int offert, typedata n)
{
List *h = head;
List *New;
int i;
for(i = 1; i < offert; i++)
{
if(h == NULL)
{
printf("插入位置无效\r\n");
return head;
}
h = h->Next;
}
New = (List *)malloc(sizeof(List));
New->data = n;
New->Next = h->Next;
h->Next = New;
printf("插入的位置是%d ,插入的数据是%d\r\n", offert, New->data);
return head;
}
//删除元素
List *deleteList(List *head, int offert)
{
List *temp = head; //遍历到被删除结点的上一个结点
int i;
for(i = 1; i < offert; i++)
{
temp = temp->Next;
}
List *del = temp->Next; //保护后面的节点
temp->Next = del->Next;
printf("删除的位置是%d ,删除的数据是%d\r\n", offert, del->data);
del->Next = NULL;
free(del);
return head;
}
//查找数据
typedata sreachList(List *head, typedata SreachData)
{
List *sreach = head;
int i = 1;
while(sreach->Next != NULL)
{
sreach = sreach->Next;
if(sreach->data == SreachData)
{
printf("查找到的数据位置是%d数据是%d\r\n", i, sreach->data);
return i;
}
i ++;
}
printf("没有找到\r\n");
return -1;
}
//更新数据
List *updateList(List *head, int offert, typedata Newdata)
{
List *temp = head;
temp = temp->Next;
int i;
for(i = 1; i < offert; i++)
{
temp = temp->Next;
}
temp->data = Newdata;
printf("更新的位置是%d ,更新的数据是%d\r\n", offert, temp->data);
return head;
}
//显示
void display(List *head)
{
List *temp = head;
printf("链表中的数据是:\r\n");
while(temp->Next != NULL)
{
temp = temp->Next;
printf("%5d", temp->data);
}
printf("\r\n");
}
//头插
int headInser(List *head, List *newData)
{
if(NULL == head || NULL == newData)
{
return -1;
}
newData->Next = head->Next;
head->Next = newData;
return 0;
}
//反转链表
List *ReverseList(List *head)
{
if(head == NULL || head->Next == NULL)
{
return;
}
List *h = head->Next;
List *p = NULL;
while(p = h->Next)
{
h->Next = p->Next; //分离p
headInser(head, p); //将p插入到首元素位置
}
return head;
}
//销毁链表
void destoryList(List *head)
{
if(head == NULL)
{
return;
}
List *h = head;
while(h = h->Next)
{
head->Next = h->Next;
free(h);
h = head;
}
free(head);
}
//测试代码
int main()
{
List *head;
int i, j;
typedata sreachdata;
char op;
printf("a-------->创建链表\r\n");
printf("b-------->插入数据\r\n");
printf("c-------->删除数据\r\n");
printf("d-------->查找数据\r\n");
printf("e-------->更新数据\r\n");
printf("f-------->显示链表\r\n");
printf("g-------->反转链表\r\n");
printf("h-------->销毁链表\r\n");
printf("q-------->退出\r\n");
while(1)
{
printf("请输入按键\r\n");
scanf("%c", &op);
switch(op)
{
case 'a': //创建链表
printf("请输入要创建的节点数\r\n");
scanf("%d", &i);
head = creatList(i);
scanf("%*c");
break;
case 'b': //插入数据
printf("请输入插入的位置和数字,不要超过创建节点的个数\r\n");
scanf("%d%d", &i, &j);
head = inserList(head, i, j);
scanf("%*c");
break;
case 'c': //删除数据
printf("请输入要删除的位置,不要超过创建节点的个数\r\n");
scanf("%d", &i);
head = deleteList(head, i);
scanf("%*c");
break;
case 'd': //查找数据
printf("请输入要查找的数据\r\n");
scanf("%d", &sreachdata);
typedata sreachData = sreachList(head, sreachdata);
scanf("%*c");
break;
case 'e': //更新数据
printf("请输入要更新的位置和数字,不要超过创建节点的个数\r\n");
scanf("%d%d", &i, &j);
head = updateList(head, i, j);
scanf("%*c");
break;
case 'f': //显示
display(head);
scanf("%*c");
break;
case 'g': //反转链表
head = ReverseList(head);
//display(head);
scanf("%*c");
break;
case 'h': //销毁链表
destoryList(head);
scanf("%*c");
break;
case 'q': //退出
scanf("%*c");
return 1;
default :
printf("ERROR\r\n");
break;
}
}
return 0;
}
//完整代码
#include<stdio.h>
#include <stdlib.h>
typedef int typedata;
//构造链表结构
typedef struct list
{
typedata data; //数据域
struct list* Next; //指针域
}List; //LIST == struct list
//创建一个链表
List *creatList(int n)
{
List *head; //定义头、普通、尾结点
int i;
head = (List *)malloc(sizeof(List));
List *h = head; //遍历链表
//int n;
for(i = 0; i < n; i++)
{
List *node = (List *)malloc(sizeof(List));
node->data = i;
node->Next = NULL; //尾结点的指针域置空
h->Next = node;
h = h->Next; //指针后移
}
return head;
}
//插入元素
List *inserList(List *head, int offert, typedata n)
{
List *h = head;
List *New;
int i;
for(i = 1; i < offert; i++)
{
if(h == NULL)
{
printf("插入位置无效\r\n");
return head;
}
h = h->Next;
}
New = (List *)malloc(sizeof(List));
New->data = n;
New->Next = h->Next;
h->Next = New;
printf("插入的位置是%d ,插入的数据是%d\r\n", offert, New->data);
return head;
}
//删除元素
List *deleteList(List *head, int offert)
{
List *temp = head; //遍历到被删除结点的上一个结点
int i;
for(i = 1; i < offert; i++)
{
temp = temp->Next;
}
List *del = temp->Next; //保护后面的节点
temp->Next = del->Next;
printf("删除的位置是%d ,删除的数据是%d\r\n", offert, del->data);
del->Next = NULL;
free(del);
return head;
}
//查找数据
typedata sreachList(List *head, typedata SreachData)
{
List *sreach = head;
int i = 1;
while(sreach->Next != NULL)
{
sreach = sreach->Next;
if(sreach->data == SreachData)
{
printf("查找到的数据位置是%d数据是%d\r\n", i, sreach->data);
return i;
}
i ++;
}
printf("没有找到\r\n");
return -1;
}
//更新数据
List *updateList(List *head, int offert, typedata Newdata)
{
List *temp = head;
temp = temp->Next;
int i;
for(i = 1; i < offert; i++)
{
temp = temp->Next;
}
temp->data = Newdata;
printf("更新的位置是%d ,更新的数据是%d\r\n", offert, temp->data);
return head;
}
//显示
void display(List *head)
{
List *temp = head;
printf("链表中的数据是:\r\n");
while(temp->Next != NULL)
{
temp = temp->Next;
printf("%5d", temp->data);
}
printf("\r\n");
}
//头插
int headInser(List *head, List *newData)
{
if(NULL == head || NULL == newData)
{
return -1;
}
newData->Next = head->Next;
head->Next = newData;
return 0;
}
//反转链表
List *ReverseList(List *head)
{
if(head == NULL || head->Next == NULL)
{
return;
}
List *h = head->Next;
List *p = NULL;
while(p = h->Next)
{
h->Next = p->Next; //分离p
headInser(head, p); //将p插入到首元素位置
}
return head;
}
//销毁链表
void destoryList(List *head)
{
if(head == NULL)
{
return;
}
List *h = head;
while(h = h->Next)
{
head->Next = h->Next;
free(h);
h = head;
}
free(head);
}
int main()
{
List *head;
int i, j;
typedata sreachdata;
char op;
printf("a-------->创建链表\r\n");
printf("b-------->插入数据\r\n");
printf("c-------->删除数据\r\n");
printf("d-------->查找数据\r\n");
printf("e-------->更新数据\r\n");
printf("f-------->显示链表\r\n");
printf("g-------->反转链表\r\n");
printf("h-------->销毁链表\r\n");
printf("q-------->退出\r\n");
while(1)
{
printf("请输入按键\r\n");
scanf("%c", &op);
switch(op)
{
case 'a': //创建链表
printf("请输入要创建的节点数\r\n");
scanf("%d", &i);
head = creatList(i);
scanf("%*c");
break;
case 'b': //插入数据
printf("请输入插入的位置和数字,不要超过创建节点的个数\r\n");
scanf("%d%d", &i, &j);
head = inserList(head, i, j);
scanf("%*c");
break;
case 'c': //删除数据
printf("请输入要删除的位置,不要超过创建节点的个数\r\n");
scanf("%d", &i);
head = deleteList(head, i);
scanf("%*c");
break;
case 'd': //查找数据
printf("请输入要查找的数据\r\n");
scanf("%d", &sreachdata);
typedata sreachData = sreachList(head, sreachdata);
scanf("%*c");
break;
case 'e': //更新数据
printf("请输入要更新的位置和数字,不要超过创建节点的个数\r\n");
scanf("%d%d", &i, &j);
head = updateList(head, i, j);
scanf("%*c");
break;
case 'f': //显示
display(head);
scanf("%*c");
break;
case 'g': //反转链表
head = ReverseList(head);
//display(head);
scanf("%*c");
break;
case 'h': //销毁链表
destoryList(head);
scanf("%*c");
break;
case 'q': //退出
scanf("%*c");
return 1;
default :
printf("ERROR\r\n");
break;
}
}
return 0;
}