自己用C语言写了一个简单的单向链表模型,算是一个简单的练习和记录
程序包含了增删改查等基本操作,其中插入操作包含了(头部插入、尾部插入)两种插入方式;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 5
#define TEST_NUM 4
typedef struct node{
int data;
struct node* next;
}node;
//默认初始化出来的头数据为10086
node* myLinkCreate()
{
node* head = NULL;
head = (node*)malloc(sizeof(node));
if (head == NULL)
{
fprintf(stderr,"malloc fail\n");
exit(1);
}
head->data = 10086;
head->next = NULL;
return head;
}
node* LinkAdd(node* myLink,int data)
{
node *p = myLink;
node *new =NULL;
new = (node*)malloc(sizeof(node));
new->data = data;
new->next = NULL;
while(p->next != NULL)
{
p = p->next;
}
p->next = new;
return myLink;
}
void LinkPrint(node *mylink)
{
if (mylink == NULL)
printf("链表不存在\n");
printf("%d ",mylink->data);
while(mylink->next != NULL)
{
//这里如果用mylink++的话,每次都会多打印一个0
mylink=mylink->next;
printf("%d ",mylink->data);
}
printf("\n");
}
//如果查找的节点存在,返回节点的坐标
int LinkSearch(node *mylink,int data)
{
int pos=0;
while((mylink->data != data) && (mylink->next != NULL))
{
mylink = mylink->next;
pos++;
}
if(mylink->data == data)
{
//printf("找到节点的数据为:%d\n",mylink->data);
return pos;
}
else{
printf("不存在节点的数据为:%d\n",data);
return -1;
}
}
//在对应内容的节点尾部插入
node *LinkInsert(node *mylink,int data,int newdata)
{
int pos,i;
node *new = (node *)malloc(sizeof(node));
new->data = newdata;
new->next = NULL;
pos = LinkSearch(mylink,data);
node *p = mylink;
if(pos == -1)
{
fprintf(stderr,"链表中不存在数据为%d的节点去插入\n",data);
exit(1);
}
else
{
for(i=0;i<pos;i++)
{
p = p->next;
}
new->next = p->next;
p->next = new;
}
return mylink;
}
//从找到的节点头部插入
node *LinkInsertFront(node *mylink,int data,int newdata)
{
int pos,i;
node *new = (node *)malloc(sizeof(node));
new->data = newdata;
new->next = NULL;
pos = LinkSearch(mylink,data);
node *p = mylink;
if(pos == -1)
{
fprintf(stderr,"链表中不存在该节点去插入");
exit(1);
}
else
{
if(pos == 0)
{
new->next = mylink;
return new;
}
else
{
for(i=0;i<pos-1;i++)
{
p = p->next;
}
new->next = p->next;
p->next = new;
}
}
return mylink;
}
node * LinkChge(node *mylink,int data,int newdata)
{
int pos,i;
node *p = mylink;
pos = LinkSearch(mylink,data);
if(pos == -1)
{
fprintf(stderr,"链表中不存在该节点去插入");
exit(1);
}
else
{
for(i=0;i<pos;i++)
{
p=p->next;
}
p->data = newdata;
}
return mylink;
}
node *LinkDel(node *mylink,int data)
{
int pos,i;
node *p = mylink;
node *tmp = NULL;
pos = LinkSearch(mylink,data);
if(pos == -1)
{
fprintf(stderr,"链表中不存在该节点去插入");
exit(1);
}
else
{
if(pos == 0)
{
mylink = mylink->next;
return mylink;
}
else
{
//移动到目标节点的前一个节点
for(i=0;i<pos-1;i++)
{
p = p->next;
}
tmp = p->next;
p->next = p->next->next;
free(tmp);
}
}
return mylink;
}
void LinkDestroy(node **mylink)
{
while((*mylink)->next != NULL)
{
(*mylink) = (*mylink)->next;
}
free(*mylink);
}
int main()
{
int i,pos;
node *myLink = NULL;
/************创建链表*************/
myLink = myLinkCreate();
printf("得到一个投节点值为10086的链表\n");
printf("%d\n",myLink->data);
/************给链表赋初值********/
for (i=1;i<=NUM;i++)
{
myLink = LinkAdd(myLink,i);
}
printf("初始赋值后的链表\n");
LinkPrint(myLink);
/************分别从头部和尾部增加节点********/
printf("从%d中尾插入数据7758\n",TEST_NUM);
myLink = LinkInsert(myLink,TEST_NUM,7758);
LinkPrint(myLink);
printf("从%d前插入行数据9537\n",TEST_NUM);
myLink = LinkInsertFront(myLink,TEST_NUM,9537);
LinkPrint(myLink);
/*************查找节点*************/
//pos = LinkSearch(myLink,3);
//printf("位置为:%d\n",pos+1);
/************修改节点数据**************/
printf("修改节点%d为520\n",TEST_NUM);
myLink = LinkChge(myLink,TEST_NUM,520);
LinkPrint(myLink);
//LinkDelete();
/**************删除节点**************/
printf("删除节点10086\n");
myLink = LinkDel(myLink,10086);
LinkPrint(myLink);
/************删除链表**********/
printf("销毁链表myLink\n");
LinkDestroy(&myLink);
LinkPrint(myLink);
}
执行结果:
[root@rio3 mylink]# ./mylink
得到一个投节点值为10086的链表
10086
初始赋值后的链表
10086 1 2 3 4 5
从4中尾插入数据7758
10086 1 2 3 4 7758 5
从4前插入行数据9537
10086 1 2 3 9537 4 7758 5
修改节点4为520
10086 1 2 3 9537 520 7758 5
删除节点10086
1 2 3 9537 520 7758 5
销毁链表myLink
0