---- 单链表第 i 个数据删除结点的算法思路:
-- 1)声明结点 p和q,p指向链表第一个结点,初始化 j=1;
-- 2)当 j<i 时,就遍历链表,让p指针向后移动,不断指向下一个结点,j 累加1;
-- 3)若到链表末尾 p 为空,则说明第 i 个元素不存在;
-- 4)否则查找成功,q=p->next;
-- 5)单链表的删除标准语句:p->next=q->next;
-- 6)将 q 结点中的数据赋值给e,作为返回。释放 q 结点。
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
} Node,*LinkList;
//typedef struct node *LinkList;
//typedef Node *LinkList;
//L:指向头指针的指针(无头结点)
Status ListInsert(LinkList *L,int i,Elemtype *e)
{
int j = 1;
LinkList p,q;
p = *L;
while(p->next && j<i-1) //遍历寻找第i-1个元素(p指向第i-1个元素)
{
p = p->next;
j++;
}
if(!(p->next)||j>=i)
{
return ERROR;
}
q = p->next; //第i个结点
p->next = q->next;
*e = q->data; //将q结点中的数据给e
free(q); //让系统回收此结点,释放内存
return OK;
}
1、建立一个学生链表(包括学号和姓名),删除指定学号的学生,并输出删除后的链表。
#include <iostream>
using namespace std;
#define New(p) { p=(STU*)malloc(sizeof(STU));\
printf("please input number and name:\n");\
scanf("%d %s",&p->num,&p->name);\
p->next=NULL;}
typedef struct Student
{
int num;//学号
char name[20];//姓名
struct Student *next;
}STU;
//链表结点的创建
STU * Create()
{
/*p1指向新建结点,p2指向前一结点,head指向头结点*/
STU *p1,*p2 = NULL,*head = NULL;
New(p1);
while(p1->num!=0) //学号不为0则添加到链表
{
if(head == NULL)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
New(p1);
}
//free(p1);
return head;
}
//链表结点的删除,删除指定学号的结点
STU * Delete(STU *head,int pnum)
{
STU *p1,*p2;
if(head == NULL)
{
printf("空表");
return head;
}
p1 = head;
while(p1->num!=pnum && p1->next!=NULL)
{
p2 = p1;
p1 = p1->next;
}
if(p1->num == pnum)
{
if(p1 == head)
{
head = p1->next;//删除头结点
}
else
{
p2->next = p1->next;//删除p1结点
}
printf("已删除学号为%d的学生。\n",pnum);
free(p1);
}
else printf("学号为%d的学生没有找到。\n",pnum);
return head;
}
//链表的输出
void Print(STU *p)
{
printf("学生的信息如下:\n");
while(p!=NULL)
{
printf("%d %s\n",p->num,p->name);
p = p->next;
}
}
int main()
{
STU *head = NULL;
head = Create();
head = Delete(head,3);
Print(head);
system("pause");
return 0;
}
输入输出信息如下: