注释部分你可以不要,这样算下来也就120左右了,给你不删掉的原因是你可以理解它的作用,如果可以请采纳!!
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode
{ //单链表存储结构
int data; //数据域
struct ListNode * next;//指针域
}LNode, * pNode; //LNode等价于struct ListNode
//pNode等价于struct ListNode *
/*--------------------创建链表-----------------------*/
pNode CreateList()
{
pNode head, p, q; //head为头结点,p为新结点,q连接所有的结点
head=q=(pNode)malloc(sizeof(LNode)); //为头结点申请空间
head->next=NULL; //头结点的数据域为空,它的数据域一般没实际意义
int x;
printf("请输入数据,以0结束\n");
scanf("%d", &x);
while(x != 0)
{
p = (pNode)malloc(sizeof(LNode)); //满足条件申请空间生成新的结点
p->data = x; //x的值赋值给新结点
p->next = NULL; //x的下一个结点未知,置空
q->next = p; //q连接下一个结点p
q = p; //q后移到新结点,准备连接下一个新的结点
scanf("%d", &x);
}
return head; //返回头结点
}
/*------------------输出链表---------------------*/
void PrintList(pNode pHead)
{
pNode node=pHead->next; //定义一个结点保存头结点的下一个结点
if(NULL == node) //判断链表是否为空
{
printf("链表为空\n");
}
while(node != NULL) //输出链表的数据域
{
printf("%-3d",node->data);
node = node->next; //输出一个结点node后移,准备输出下一个结点
}
printf("\n");
}
/*-------------------链表的长度-------------------*/
int Lenthlist(pNode pHead)
{
pNode node=pHead->next; //定义一个结点保存头结点的下一个结点
int len = 0; //len计算表长
if(NULL == node) //判断链表是否为空
{
printf("链表长度为0\n");
return len;
}
while(node != NULL)
{
++len; //结点存在,len自加
node = node->next; //输出一个结点node后移
}
return len;
}
/*------------------查询数据-----------------*/
int FindVal(pNode pHead, int val) //说明:查到了就返回1,并没有说明查到数据的位置
{
pNode node = pHead->next;
while(node != NULL)
{
if(val == node->data)
return 1; //数据存在返回1
node = node->next;
}
return 0; //数据不存在返回0
}
/*-------------------位置查询-------------------*/
int Findpos(pNode pHead, int posnode, int *val)
{
int len = Lenthlist(pHead); //先求表长,判断查询的位置是否合法
pNode node = pHead->next;
int s = 0; //计算第几个结点
if(posnode<1 && posnode>len) //查询位置不合法返回0
return 0;
else
{
while(node != NULL)
{
s++;
if(s == posnode) //查询位置
{
*val = node->data; //位置合法,所对应的的数据通过指针返回给主函数
break;
}
node = node->next;
}
}
return 1;
}
/*------------------按位置删除结点-----------------*/
pNode DeletNode(pNode pHead, int pos)
{
pNode node = pHead; //保存头结点
int len = Lenthlist(pHead)+1; //头结点也算入链表长
int s=0;
if(pos<1 || pos>=len) //删除的结点的位置不合法
{
printf("你要删除的位置不存在\n");
return pHead;
}
else
{
s++;
while(node->next != NULL && s<pos) //先找到要删除结点前面的那一个结点
{
node = node->next;
s++;
}
pNode q = node->next; //保存删除的结点
node->next = q->next; //删除结点的前一个结点链接删除结点的下一个结点
free(q); //释放删除结点的空间
return pHead;
}
}
/*----------------插入结点-----------------*/
pNode InsertNode(pNode pHead, int inserval, int pos)
{
pNode node = pHead;
int len = Lenthlist(pHead)+1; //加上了头结点的链表的长度
int s=0;
if(pos<1 || pos>len) //判断插入的位置是否合法
{
printf("你要插入的位置不合法\n");
return pHead;
}
while(node!=NULL && s<pos-1) //找到插入结点的前一个位置
{ //这也就是为什么要把头结点算入链表的长度
node = node->next;
s++;
}
pNode newnode = (pNode)malloc(sizeof(LNode)); //申请一个结点的空间
newnode->data = inserval; //把插入的数据赋值给新结点的数据域
newnode->next = node->next; //新结点的指针域指向插入位置的结点
node->next = newnode; //插入位置的前一个结点的指针域指向新结点
return pHead; //返回头结点
}
/*-----------------链表的逆置------------------*/
pNode ReverseList(pNode phead)
{
pNode q, p = phead->next;
phead->next = NULL;
while(p != NULL)
{
q = p->next;
p->next = phead->next;
phead->next = p;
p = q;
}
return phead;
}
/*------------------销毁链表-----------------*/
pNode DeleteList(pNode phead)
{
pNode q, p = phead;
while(p!=NULL)
{
q = p;
p = p->next;
free(q);
}
return phead;
}
int main()
{
pNode HeadNode; //头结点
int length = 0; //链表长度
int valnode = 0; //查询的数据
int valfinal = 0; //查询数据后的结果
int posnode = 0; //位置查询
int posfinal = 0; //位置查询后的结果
int posval = 0; //位置查询到的数据
int delpos = 0; //删除结点的位置
int inval = 0; //插入的数据
int inpos = 0; //插入的位置
HeadNode = CreateList(); //创建链表后的头结点
length = Lenthlist(HeadNode); //统计链表结点
/*--------------输出链表的长度----------------*/
// printf("链表长度为:%d\n", length); //输出表长
// PrintList(HeadNode); //输出链表
/*-----------------查询数据-------------------*/
/* printf("请输入你要查找的数据\n");
scanf("%d", &valnode);
valfinal = FindVal(HeadNode, valnode);
if(valfinal == 1)
printf("你要查找的数据存在\n");
else
printf("你要查找的数据不存在\n");
*/
/*-----------------位置查询-------------------*/
/* printf("请输入你要查询第几个结点:");
scanf("%d",&posnode);
posfinal = Findpos(HeadNode, posnode, &posval);
if(posfinal == 0)
printf("你要查询的位置不合法\n");
else
printf("第%d个结点的数据为:%d\n", posnode, posval);
*/
/*------------------删除结点-----------------*/
/* printf("请输入要删除结点的位置:\n");
scanf("%d", &delpos);
HeadNode = DeletNode(HeadNode, delpos);
printf("删除结点后的链表:\n");
PrintList(HeadNode);
*/
/*------------------插入结点-----------------*/
/* printf("请输入要插入的数据:");
scanf("%d",&inval);
printf("请输入要插入的位置:");
scanf("%d",&inpos);
HeadNode = InsertNode(HeadNode, inval, inpos);
PrintList(HeadNode);
*/
/*-----------------链表的逆置------------------*/
/* HeadNode = ReverseList(HeadNode);
PrintList(HeadNode); */
/*------------------销毁链表-----------------*/
HeadNode = DeleteList(HeadNode);
if(HeadNode)
printf("链表空!");
return 0;
}
追问指针节点什么的都没有学到,能有简单的基本结构,不是错的就行了,大神,能在给我一个更简单的吗??万分感谢
追答这算比较简单的了,更简单的也就60、70行的了