【单链表算法】设带头结点的非空单链表 L,设计一个算法删除 L 中奇数序号
的结点,即删除 L 中第 1、3、5…结点。
#include<stdio.h>
#include<malloc.h>
typedef struct node {
int data;
struct node* next;
}node; // 定义结构体
node* creat(int length) { // 创建链表函数
node* p;
int n;
if (length < 1)
return NULL; // 如果链表长度小于1的话,返回空
node* head = (node*)malloc(sizeof(node)); // 开辟头结点的链表单元
head->next = NULL;
node* temp = head; //定义中间链表指针
int i = 1;
printf("请输入%d个整数:\n",length);
while (i <= length) {
p = (node*)malloc(sizeof(node)); // 开辟新的结点
scanf_s("%d", &n);
p->data = n;
temp->next = p;
temp = p; // 使用temp不断地进行遍历
i++;
}
temp->next = NULL; // 尾指针下一个指向空
return head;
}
void delete(node*L){
node*pre=L,*p=pre->next; // pre指向头节点,p指向头指针的下一个
while(p!=NULL){
pre->next=p->next;
free(p); // 删除结点p,并释放p
pre=pre->next; // 跳过偶数结点的指针
if(pre==NULL)
break; // 遍历完退出
p=pre->next;
}
}
void Print(node* L) {
node* p;
p= L->next;
if (p==NULL){
printf("链表中没有元素!");
return;
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
}
int main() {
node* L;
int n;
printf("输入链表的长度:");
scanf("%d",&n);
L = creat(n);
delete(L);
printf("删除之后的链表为:\n");
Print(L);
}