题目:链表作业
代码:
func.c
#include <stdio.h>
#include <stdlib.h>
#include "./d220.h"
//创建一个带头结点的单链表
linkList* create_linkList()
{
linkList* head = (linkList*)malloc(sizeof(linkList));
if(NULL == head)
{
printf("头结点申请失败,创建单链表失败\n");
return NULL;
}
head->text.len = 0;//初始化头结点中链表长度为0
head->next = NULL;//初始化头结点中的指针域为NULL
return head;
}
//头插法
void insertHead_linkList(linkList* head,dataType num)
{
//创建一个新的结点
linkList* temp =(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,头插失败\n");
return;
}
temp->text.data = num;
temp->next=NULL;
//头插法插入数据
temp->next = head->next;
head->next = temp;
//更新头结点中记录的链表长度
head->text.len++;
return ;
}
//遍历链表
void show_linkList(linkList* head)
{
linkList* p=head;
while(p->next != NULL)
{
p = p->next;
printf("%d ",p->text.data);
}
printf("\n");
return;
}
//尾插法插入数据
void insertTail_linkList(linkList*head,dataType num)
{
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,尾插失败\n");
return;
}
//初始化新的结点
temp->next=NULL;
temp->text.data = num;
//尾插法插入数据
//找到链表的尾结点
linkList* p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next = temp;
temp->next = NULL;
//更新头结点中记录的链表长度
head->text.len++;
return;
}
//判断链表是否为空
int isEmpty_linkList(linkList* head)
{
return head->next==NULL ? 1:0;
}
dataType deleteHead_linkList(linkList* head)
{
//判断链表是非为空
if(isEmpty_linkList(head))
{
printf("头删失败,链表为空\n");
return -1;
}
//头删法删除
linkList* temp = head->next;
head->next = temp->next;
//另存要删除的结点中的有效数据,然后释放
dataType num=temp ->text.data;
free(temp);
temp = NULL;
//更新头结点中记录的链表长度
head->text.len--;
}
//尾删法
dataType deleteTail_linkList(linkList* head)
{
//判断链表是非为空
if(isEmpty_linkList(head))
{
printf("头删失败,链表为空\n");
return -1;
}
linkList* temp = head;//让temp指向头结点
//循环找倒数第二个结点
while(temp->next->next!=NULL)
{
temp = temp->next;
}
//上述循环结束后,找到了倒数第2个结点
dataType num = temp->next->text.data;//将倒数第一个结点的数据另存
free(temp->next);//释放倒数第一个结点
temp->next = NULL;//将倒数第二个结点的指针域指向NULL
//更新头结点中记录的链表长度
head->text.len--;
}
//按照位置插入,位置编号从一开始
void insertByPos_linkList(linkList* head,int pos,dataType num)
{
//判断位置是非合法
if(pos<1||pos>head->text.len+1)
{
printf("pos=%d 插入位置非法,插入失败\n",pos);
return;
}
//循环查找要插入位置的前一个结点位置
linkList* p=head;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
//上述循环完毕后,p指向要插入位置的前一个结点
//创建一个新的结点插入到链表中
linkList* temp=(linkList*)malloc(sizeof(linkList));
if(NULL == temp)
{
printf("结点申请失败,尾插失败\n");
return;
}
temp->text.data = num;
temp->next = NULL;
//插入结点
temp->next = p->next;
p->next = temp;
//更新头结点中记录的链表长度
head->text.len++;
return;
}
//按位置删除
dataType deleteByPos_linkList(linkList* head,int pos)
{
//判断链表是否为空
if(isEmpty_linkList(head))
{
printf("链表为空,删除失败\n");
return -1;
}
//判断删除位置是否合法
if(pos<=0||pos>head->text.len)
{
printf("pos=%d 删除位置非法,删除失败\n",pos);
return -1;
}
//循环查找要删除位置的前一个结点位置
linkList* p=head;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
//上述循环完毕后,p指向要删除位置的前一个结点
//修改指向,释放要删除的结点
linkList* temp=p->next; //另存要删除的结点的地址
p->next=temp->next;
dataType num = temp->text.data;
free(temp);
temp = NULL;
//更新头结点中记录的链表长度
head ->text.len--;
return num;
}
main.c
#include <stdio.h>
#include "./d220.h"
int main(int argc, const char *argv[])
{
linkList* head = create_linkList();
insertHead_linkList(head,10 );
insertHead_linkList(head,20 );
show_linkList(head);
insertTail_linkList(head,20);
insertTail_linkList(head,30);
insertTail_linkList(head,40);
insertTail_linkList(head,50);
show_linkList(head);
deleteHead_linkList(head);
show_linkList(head);
deleteHead_linkList(head);
show_linkList(head);
deleteHead_linkList(head);
show_linkList(head);
deleteHead_linkList(head);
show_linkList(head);
deleteTail_linkList(head);
show_linkList(head);
insertByPos_linkList(head,1,66);
show_linkList(head);
deleteByPos_linkList(head,1);
show_linkList(head);
return 0;
}
.h文件:
#ifndef LINKLIST_H_
#define LINKLIST_H_
typedef int dataType;
union msg{
dataType data;
int len;
};
typedef struct node{
union msg text;
struct node* next;
}linkList;
linkList* create_linkList();
void insertHead_linkList(linkList* head,dataType num);
void show_linkList(linkList* head);
void insertTail_linkList(linkList*head,dataType num);
dataType deleteHead_linkList(linkList* head);
dataType deleteTail_linkList(linkList* head);
void insertByPos_linkList(linkList* head,int pos,dataType num);
dataType deleteByPos_linkList(linkList* head,int pos);
#endif
运行结果: