为了成功上岸之链表编程总结
1. 单链表的创建,插入和删除
单链表第pos位置插入结点的算法思路:
- 声明一个结点p指向链表的头结点,初始化i从1开始;
- 当i < pos时,就遍历链表,让p的指针向后移动,不断指向下一结点,i累加1;
- 若到链表末尾p为空,则说明第pos个元素不存在;
- 否则査找成功,在系统中生成一个空结点q;
- 将数据元素elem賦值给q->data;
- 单链表的插入标准语句q->next=p->next; p->next=q;
- 返回成功。
单链表删除pos位置的结点的算法思路:
- 声明一个结点p指向链表第一个结点,初始化i从1开始;
- 当i<pos时,就遍历链表,让p的指针向后移动,不断指向下一个结点,i累加 1;
- 若到链表末尾p为空,则说明第pos个元素不存在;
- 否则査找成功,将欲删除的结点p->next賦给q;
- 单链表的删除标准语句p->next=q->next;
- 释放q结点;
- 返回成功。## 标题
完整代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
typedef struct node
{
int data;
struct node *next;
}Node;
Node *CreateList(int n) //创建含有n个结点的单链表
{
Node *head;
head = (Node *)malloc(sizeof(Node)); /*创建头结点*/
Node *q = head;
/* 初始化随机数种子 */
srand(time(0)); //srand函数在stdlib.h头文件中,time函数在time.h头文件中
int i;
for(i = 0; i < n; i++)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = rand() % 100 + 1; //随机生成100以内的数字
q->next = p;
q = p;
}
q->next = NULL;
return head;
}
/*在链表的pos位置插入元素elem*/
void InsertNode(Node *head, int pos, int elem)
{
Node *p = head; //声明一个结点p指向链表的头结点,初始化i从1开始
int i = 1;
/*当i < pos时,就遍历链表,让p的指针向后移动,不断指向下一结点,i累加1;
*若到链表末尾p为空,则说明第pos个元素不存在;
*/
while(p && i < pos) //这里寻找第i-1个节点(这里用p而不是p->next是因为可以在最后一个节点后插入)
{
p = p->next;
i++;
}
if(!p || i > pos)
printf("要插入的位置不存在\n");
Node *q = (Node *)malloc(sizeof(Node));
q->data = elem;
q->next = p->next; //这两句是单链表的标准插入语句,位置一定不能换
p->next = q;
}
/*删除链表pos位置的元素*/
void DeleteNode(Node *head, int pos)
{
Node *p = head;
Node *q; //用于释放结点
int i= 1;
while(p->next && i < pos) //这里寻找第i-1个结点(这里用p->next是因为必须保证有后继,他不是终结点)
{
p = p->next;
i++;
}
if(!p->next || i > pos)
printf("要删除的位置不存在\n");
q = p->next;
p->next = q->next; //也就是 p->next = q->next->next
free(q); //让系统回收此结点,释放内存
}
/*打印链表*/
void print(Node *head)
{
Node *p;
if(head->next==NULL)
{
printf("The LinkList is Empty !");
return;
}
p=head->next;
while(p!=NULL)
{
printf("%d ", p->data);
p=p->next;
}
}
int main()
{
Node *SingleLinkList = NULL;
int length;
printf("Please input the length of LinkList: \n");
scanf("%d", &length);
SingleLinkList = CreateList(length);
printf("The new created LinkList as below: \n");
print(SingleLinkList);
printf("\n");
int position_insert, position_delete;
int data;
printf("请输入要插入的元素及其插入位置: \n");
scanf("%d %d", &data, &position_insert);
InsertNode(SingleLinkList, position_insert, data);
printf("插入新元素后的链表如下: \n");
print(SingleLinkList);
printf("\n");
printf("请输入要删除元素的位置: \n");
scanf("%d", &position_delete);
DeleteNode(SingleLinkList, position_delete);
printf("删除 %d 位置的元素后,链表如下: \n", position_delete);
print(SingleLinkList);
printf("\n");
system("pause");
return 0;
}
运行结果