c语言——链表的基本操作

#include <stdio.h>
typedef int ElementType;
typedef struct ListNode{
int k;
ElementType element;
struct ListNode *m_pNext;

}ListNode,*PNODE;

//在k处插入元素

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{
if (pListHead == NULL)
{
return NULL;
}

ListNode *pAhead = pListHead;
ListNode *pBehind = NULL;
for (int i = 0; i < k - 1; i++)
{
pAhead = pAhead->m_pNext;
}
pBehind = pListHead;
while (pAhead->m_pNext != NULL)
{
pAhead = pAhead->m_pNext;
pBehind = pBehind->m_pNext;
}

return pBehind;

}

//创建链表

PNODE CreateList(int lens)
{
int data;
PNODE  pHead = (PNODE)malloc(sizeof(ListNode));
if (pHead == NULL)
{
printf("分配空间失败请重新分配\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->m_pNext = NULL;
printf("开始分配链表个数\n");
for (int i = 0; i < lens; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(ListNode));
if (pNew == NULL)
{
printf("空间分配失败\n");
exit(-1);
}
printf("请输入第%d个数据", i + 1);
scanf_s("%d", &data);
pNew->element = data;
pTail->m_pNext = pNew;
pNew->m_pNext=NULL;
pTail = pTail->m_pNext;
}
printf("创建链表成功\n");
return pHead;

};

//将两个链表连接在一起

 PNODE ADDList(ListNode *head1, ListNode *head2)
{
ListNode *pr;
pr = head1;
while(pr->m_pNext!=NULL)
{
pr = pr->m_pNext;
}
pr->m_pNext= head2->m_pNext;
/*head2 = NULL;*/
/*printf("输出合并后的两个链表\n");*/
/*while (pr->m_pNext != NULL)
{
printf("%d", pr->m_pNext->element);
pr = pr->m_pNext;
}*/
return head1;
};
 //链表查询
 PNODE findList(ListNode *list,int val)
 {
PNODE p = list;
if (p->m_pNext == NULL)
{
return;
}
 
/*int val;*/
int num = 0;
/*printf("输入要查询的数:\n");
scanf_s("%d", &val);*/
while(p !=NULL&& p->element!=val)
{
p = p->m_pNext;
num++;
}
if (p != NULL)
{
printf("这个数在第%d个数:", num + 1);
}
else 
{
printf("没有找到这个节点");
}
printf("\n");
 }
 //链表插入
 void InsertList(ListNode *list, int pos, int val)
 {
int position = 0;
PNODE p = list;
while (p->m_pNext != NULL && position < pos)
{
p = p->m_pNext;
position++;
}
PNODE tmp = (PNODE)malloc(sizeof(PNODE));
tmp->element = val;
tmp->m_pNext = p->m_pNext;
p->m_pNext = tmp;
 
 }
 //链表删除
 void deleteAllListNode(ListNode *list)
 {
PNODE p,tmp;
p = list->m_pNext;
list->m_pNext = NULL;
while (p != NULL)
{
tmp = p->m_pNext;
free(p);//删除第一个节点
p = tmp;
}
printf("链表删除成功");
 }
 //删除指定节点
 void deleListNode(ListNode *list, int pos)
 {
int position = 0;
PNODE p;
p = list;
while (p != NULL && position < pos-1)
{
p = p->m_pNext;
position++;
}
PNODE tmp = p->m_pNext;
p->m_pNext = tmp->m_pNext;
free(tmp);
tmp = NULL;


 }
 //    定义链表遍历函数
 void TraverseList(ListNode *List) {
PNODE P = List->m_pNext;    //    首节点赋值给临时节点P
printf("遍历链表的值为:");
if (P == NULL)
printf("链表为空");
while (P != NULL)        //当临时节点P不为尾节点时,输出当前节点值 
{
printf("%d ", P->element);
P = P->m_pNext;
}
printf("\n");
 }
 int main() {
int lens = 6;
printf("创建列表1\n");
PNODE list1 = CreateList(lens);
printf("创建列表2\n");
PNODE list2 = CreateList(lens);
int k = 2;
struct ListNode *t;
printf("找到倒数第k个数\n");
t = FindKthToTail(list1, k);
printf("倒数第%d个数是%d\n", k, t->element);
PNODE list;
printf("合并两个列表\n");
list = ADDList(list1, list2);
printf("遍历列表\n");
TraverseList(list);
printf("找到第数字为3\n");
findList(list, 3);
printf("在第六个地方插入\n");
InsertList(list, 6, 11111);
TraverseList(list);
printf("在第六个地方删除\n");
deleListNode(list, 6);
TraverseList(list);
printf("删除整个列表\n");
deleteAllListNode(list);
return 0;
 }

猜你喜欢

转载自blog.csdn.net/qq_35307209/article/details/80671606