//带有头结点的链表的C实现
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;//数据域
struct Node * next;//指针域
}Node;
/************************************************************************
*函数名称:Create
*函数功能:创建链表.
*输入:各节点的data
*返回值:指针head
************************************************************************/
Node * Create()
{
int n = 0;
Node *head,*p1;
head = malloc(sizeof(Node));
head->data = 0;//链表元素个数为0
head->next = NULL;
p1 = head;
while(1){
int tmp;
if(scanf("%d",&tmp)!=1)
break;
p1->next = malloc(sizeof(Node));
p1->next->data = tmp;
p1 = p1->next;
head->data++;
}
p1->next = NULL;
return head;
}
/************************************************************************
*函数名称:insert
*函数功能:在链表中插入元素.
*输入:head 链表头指针,p新元素插入位置(p应该大于等于1,小于等于链表元素长度加1),x 新元素中的数据域内容
*返回值:如果成功返回1,否则返回0
*************************************************************************/
int insert(Node * head,int p,int x){
Node * tmp = head;
int i;
Node * tmp2 ;
if(p<1 || p >(head->data+1)){
printf("插入元素错误:插入位置不可用\n");
return 0;
}
if(tmp == NULL){
printf("插入元素错误:链表头结点不能为NULL");
return 0;
}
tmp2 = malloc(sizeof(Node));
//for循环是为了防止插入位置超出了链表长度
for(i=0; i<p-1; i++)
{
tmp = tmp->next;
}
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
head->data ++;//插入成功,头结点中表示链表长度的元素加1
return 1;
}
/************************************************************************
*函数名称:del
*函数功能:删除链表中的元素
*输入:head 链表头指针,p 被删除元素位置(p应该大于等于1,小于等于链表元素长度)
*返回值:被删除元素中的数据域.如果删除失败返回0
*************************************************************************/
int del(Node * head,int p){
Node * tmp = head;
Node * realse;
int i;
int ret;
if(p<1 || p> head->data){//失败
printf("删除元素失败:删除位置不可用\n");
return 0;
}
if (tmp == NULL){
printf("删除元素失败:链表头结点不能为NULL\n");
return 0;
}
for(i=0; i<p; i++)
{
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
realse = tmp->next;
head->data -- ;
tmp->next = tmp->next->next;
free(realse);
return ret;
}
/************************************************************************
*函数名称:print
*函数功能:输出链表中所有的数据
*输入:链表头结点
*返回值:无
/************************************************************************/
void print(Node *head){
Node * tmp;
printf("元素总数为%d,分别为:",head->data);
for( tmp = head->next; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/************************************************************************
*函数名称:init
*函数功能:初始化链表
*输入:无
*返回值:返回链表的头结点
/************************************************************************/
Node * init()
{
Node * head = malloc(sizeof(Node));
head->data = 0; //头结点的data域中存放该链表的元素个数
head->next = NULL;
return head;
}
/************************************************************************
*函数名称:freeList
*函数功能:释放链表所占用的空间
*输入:链表头结点
*返回值:无
/************************************************************************/
void freeList(Node * head)
{
Node * p1 = head;
Node * p2 ;
while (p1 != NULL){
p2 = p1;
p1 = p1->next;
free(p2);
}
}
//主函数,用于测试
int main()
{
Node *head = Create();
print(head);
del(head,3);
print(head);
freeList(head);
return 0;
}
链表
最新推荐文章于 2024-06-14 09:15:00 发布