链表的两种不同插入方法之前插法

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
int data;
struct Node *pNext;
}NODE, *PNODE; //NODE等价于struct Node PNODE等价于struct Node *

PNODE create_list(); //创建一个非循环链表
int traverse_list(PNODE pHead); //遍历
void sort_list(PNODE pHead, int len); //排序
int delete_list(PNODE, int); //删除
int insert_list(PNODE); //插入
int is_empty(PNODE);

int main()
{
PNODE pHead = NULL;
int len = 0;


pHead = create_list();
len = traverse_list(pHead);
//sort_list(pHead, len);
//delete_list(pHead, len);
insert_list(pHead);

free(pHead);
return 0;
}

PNODE create_list()
{
PNODE pNew; //新建节点
PNODE pTail; //表尾
PNODE pHead; //表头
int len;
int i;

pHead = (PNODE)malloc(sizeof(NODE));
if(pHead == NULL)
{
printf("内存不足,程序退出!");
exit(-1);
}
pHead->data = 0; //初始化头节点
pHead->pNext = NULL;
pTail = pHead;
printf("请输入您需要生成的链表节点个数:len = ");
scanf("%d",&len);
for(i = 0; i < len; i++)
{

pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("内存不足,程序退出!");
exit(-1);
}
printf("请输入第%d个数据:",i+1);
scanf("%d",&pNew->data);
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;

}
//free(pNew);
return pHead;

}

int traverse_list(PNODE pHead)
{
PNODE p;
int len = 0;
p = pHead->pNext;
while(p != NULL)
{
printf("%d,",p->data);
p = p->pNext;
len++;
}
if(p != pHead->pNext)
{
printf("\b.\n");
printf("节点个数为%d\n",len);
return len;
}
else
return is_empty(pHead);
}

void sort_list(PNODE pHead, int len)
{
PNODE p, q;
int i, j, t;
if(pHead->pNext == NULL) exit(-1);
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;
}
}
printf("排序后链表为:\n");
for(p = pHead->pNext; p != NULL; p = p->pNext)
printf("%d ",p->data);
}

int is_empty(PNODE pHead)
{
if(pHead->pNext == NULL)
{
printf("链表为空!");
return 1;
}
else
return 0;
}

int delete_list(PNODE pHead, int len)
{
int val, n, i;
PNODE p = pHead->pNext, q = pHead;
if(p == NULL) return 0;
printf("\n请输入要删除的元素及其位置:");
scanf("%d %d", &val, &n);
for(i = 1; i != n && i <= len; ++i )
{
p = p->pNext; q = q->pNext;
}
//printf("\n%d, %d, i = %d\n",p->data, q->data, i);
if(i == n && p->data == val)
{
q->pNext = p->pNext; //p指向当前要删除的结点,q指向他的前驱结点
free(p);
}
else
{
printf("输入错误,找不到对应的结点或位置!");
return 0;
}
printf("您已经删除了第%d个结点%d!\n", n, val);
traverse_list(pHead);
return 1;

}

int insert_list(PNODE pHead)
{
PNODE p, pNew;
int i = 1, val, n;
printf("将要把val插入到第n个结点前面:");
scanf("%d %d",&val, &n);
p = pHead;

while( p != NULL && i < n )
{
p = p->pNext;
i++;
}
if(i > n || p == NULL)
return 0;
pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("内存已满,插入失败!");
return 0;
}
pNew->data = val;
pNew->pNext = NULL;
pNew->pNext = p->pNext;
p->pNext = pNew;
traverse_list(pHead);
return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值