经过三天时间,日思夜想,终于把整个动态链表理顺了,其实挺简单,从添加到删除,测试完成代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node //创建结构体
{
int data;
struct node *next;
}list,*lplist;
lplist createlist() //创建表头
{
lplist head=(lplist)malloc(sizeof(list));
head->next=nullptr;
return head;
}
lplist createnode(int data) //创建结点
{
lplist newnode=(lplist)malloc(sizeof(list));
newnode->next=nullptr;
newnode->data=data;
return newnode;
}
void insertnodebylist(lplist list,int data) //表头法插入结点
{
lplist newnode=createnode(data);
newnode->next=list->next;
list->next=newnode;
}
void insertnodebytail(lplist list,int data) //表尾法插入结点
{
lplist newnode=createnode(data);
lplist p=list;
while(p->next!=nullptr)
{
p=p->next;
}
p->next=newnode;
}
void deletenodebylist(lplist list,int posdata)//删除指定结点
{lplist p=list;
lplist q=list->next;
if(q==nullptr)
printf("此表为空");
while(q->data!=posdata)
{p=q;
q=p->next;
}
if(q->next==nullptr)
printf("未找到指定数据");
if(q->data==posdata)
p->next=q->next;
}
void addnodebylist(lplist list,int pos,int posdata)//添加指定结点
{
lplist newnode=createnode(posdata);
lplist p=list;
lplist q=list->next;
if(q->next==nullptr)
printf("此为空表");
while(q->data!=pos)
{
p=q;
q=p->next;
}
if(q->data==pos)
{ newnode->next=q;
p->next=newnode;
}
}
void printlist(lplist list) //打印链表
{
lplist p=list->next;
while(p)
{
printf("%d->",p->data);
p=p->next;
}
}
int main()
{lplist list=createlist();
printf("创建1-7的链表,从链表头部依次添加:\n");
insertnodebylist(list,1);
insertnodebylist(list,2);
insertnodebylist(list,3);
insertnodebylist(list,4);
insertnodebylist(list,5);
insertnodebylist(list,6);
insertnodebylist(list,7);
printlist(list);
printf("\n\n");
printf("在链表末尾添加一个0:\n");
insertnodebytail(list,0);
printlist(list);
printf("\n\n");
printf("删除链表指定位置数据域为6的结点:\n");
deletenodebylist(list,6);
printlist(list);
printf("\n\n");
printf("在链表指定位置3之前,添加数据域为9结点:\n");
addnodebylist(list,3,9);
printlist(list);
printf("\n\n");
system("pause");
return 0;
}