学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
2010-10-25 16:34
1186 查看
链表是最简单的一种数据结构,是每个软件开发者必须掌握的,也是企业招聘时最常考的内容,因此,在这里总结一下单链表的一些基本操作。
注:这里是单向无环链表,头结点中存放了数据,换句话说就是头结点和其他结点没什么区别,你也可以说成不带头结点的链表。下面就是链表操作的源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Lnode;
void printList(Lnode *head);
Lnode *createList();
Lnode *insertList(Lnode *head,int elem,int position);
Lnode *deleteElem(Lnode *head,int elem);
Lnode *reverseList(Lnode *head);
int main()
{
Lnode *head;
int elem,position;
head = createList();
printList(head);
printf("Input the element and the position:/n");
scanf("%d %d", &elem, &position);
head = insertList(head,elem,position);
printList(head);
head = reverseList(head);
printf("After reversed:/n");
printList(head);
printf("Input the element you want to delete:/n");
scanf("%d",&elem);
head = deleteElem(head, elem);
printList(head);
return 0;
}
/*传入表头指针,打印链表*/
void printList(Lnode *head)
{
Lnode *p = head;
if (p == NULL)
{
printf("List is empty!/n");
return;
}
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("/n");
}
/*创建一个新链表,返回表头指针*/
Lnode *createList()
{
Lnode *head, *current, *p;
int data;
head = (Lnode *)malloc(sizeof(Lnode));
p = head;
printf("Input integers,0 to break:/n");
scanf("%d",&data);
if (data != -1)
{
p->data = data;
}
else
{
head->next = NULL; //只有头结点的情况
return head;
}
while (1)
{
scanf("%d", &data);
if (data == -1)
{
break;
}
current = (Lnode *)malloc(sizeof(Lnode));
current->data = data;
p->next = current;
p = p->next;
}
p->next = NULL;
return head;
}
/*链表的插入操作,head为链表表头,elem为要插入的元素,position为插入的位置
*将elem插入至第position个结点后,position<=0时,插入至头结点后
*/
Lnode *insertList(Lnode *head,int elem,int position)
{
Lnode *current, *p;
int i = position - 1;
current = head;
/*找到第position个节点*/
while (i > 0 && current->next != NULL)
{
current = current->next;
i--;
}
if (i > 0) //结点数小于输入的位置position
{
printf("Position is wrong!/n");
return head;
}
p = (Lnode *)malloc(sizeof(Lnode));
p->data = elem;
p->next = current->next;
current->next = p;
return head;
}
/*删除链表head中所有的元素elem,返回头结点head*/
Lnode *deleteElem(Lnode *head,int elem)
{
Lnode *p = head;
Lnode *ptemp;
int flag = 0; //记录便表中elem的个数
while (1)
{
if (head->data == elem) //删除头结点的情况
{
flag++;
head = head->next;
free(p);
p = head;
}
else
{
break;
}
}
while (p->next != NULL)
{
if (p->next->data == elem )
{
flag++;
ptemp = p->next;
if (p->next->next != NULL)
{
p->next = p->next->next;
free(ptemp);
ptemp = NULL;
}
else //最后一个结点
{
free(ptemp);
ptemp =NULL;
p->next = NULL;
break;
}
}
else //没有删除结点时,查询下一个结点
{
p = p->next;
}
}
printf("%d number '%d' was found and deleted./n", flag, elem);
return head;
}
/*将链表逆序,该链表不带头结点。*/
Lnode *reverseList(Lnode *head)
{
Lnode *current, *pnext, *ptemp;
current = head;
pnext = head->next;
head->next =NULL;
while (pnext != NULL)
{
ptemp = pnext->next;
pnext->next = current;
current = pnext;
pnext = ptemp;
}
head = current;
return head;
}
注:这里是单向无环链表,头结点中存放了数据,换句话说就是头结点和其他结点没什么区别,你也可以说成不带头结点的链表。下面就是链表操作的源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}Lnode;
void printList(Lnode *head);
Lnode *createList();
Lnode *insertList(Lnode *head,int elem,int position);
Lnode *deleteElem(Lnode *head,int elem);
Lnode *reverseList(Lnode *head);
int main()
{
Lnode *head;
int elem,position;
head = createList();
printList(head);
printf("Input the element and the position:/n");
scanf("%d %d", &elem, &position);
head = insertList(head,elem,position);
printList(head);
head = reverseList(head);
printf("After reversed:/n");
printList(head);
printf("Input the element you want to delete:/n");
scanf("%d",&elem);
head = deleteElem(head, elem);
printList(head);
return 0;
}
/*传入表头指针,打印链表*/
void printList(Lnode *head)
{
Lnode *p = head;
if (p == NULL)
{
printf("List is empty!/n");
return;
}
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("/n");
}
/*创建一个新链表,返回表头指针*/
Lnode *createList()
{
Lnode *head, *current, *p;
int data;
head = (Lnode *)malloc(sizeof(Lnode));
p = head;
printf("Input integers,0 to break:/n");
scanf("%d",&data);
if (data != -1)
{
p->data = data;
}
else
{
head->next = NULL; //只有头结点的情况
return head;
}
while (1)
{
scanf("%d", &data);
if (data == -1)
{
break;
}
current = (Lnode *)malloc(sizeof(Lnode));
current->data = data;
p->next = current;
p = p->next;
}
p->next = NULL;
return head;
}
/*链表的插入操作,head为链表表头,elem为要插入的元素,position为插入的位置
*将elem插入至第position个结点后,position<=0时,插入至头结点后
*/
Lnode *insertList(Lnode *head,int elem,int position)
{
Lnode *current, *p;
int i = position - 1;
current = head;
/*找到第position个节点*/
while (i > 0 && current->next != NULL)
{
current = current->next;
i--;
}
if (i > 0) //结点数小于输入的位置position
{
printf("Position is wrong!/n");
return head;
}
p = (Lnode *)malloc(sizeof(Lnode));
p->data = elem;
p->next = current->next;
current->next = p;
return head;
}
/*删除链表head中所有的元素elem,返回头结点head*/
Lnode *deleteElem(Lnode *head,int elem)
{
Lnode *p = head;
Lnode *ptemp;
int flag = 0; //记录便表中elem的个数
while (1)
{
if (head->data == elem) //删除头结点的情况
{
flag++;
head = head->next;
free(p);
p = head;
}
else
{
break;
}
}
while (p->next != NULL)
{
if (p->next->data == elem )
{
flag++;
ptemp = p->next;
if (p->next->next != NULL)
{
p->next = p->next->next;
free(ptemp);
ptemp = NULL;
}
else //最后一个结点
{
free(ptemp);
ptemp =NULL;
p->next = NULL;
break;
}
}
else //没有删除结点时,查询下一个结点
{
p = p->next;
}
}
printf("%d number '%d' was found and deleted./n", flag, elem);
return head;
}
/*将链表逆序,该链表不带头结点。*/
Lnode *reverseList(Lnode *head)
{
Lnode *current, *pnext, *ptemp;
current = head;
pnext = head->next;
head->next =NULL;
while (pnext != NULL)
{
ptemp = pnext->next;
pnext->next = current;
current = pnext;
pnext = ptemp;
}
head = current;
return head;
}
相关文章推荐
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- C语言实现双链表基本操作(创建、查找、插入、删除)
- 循环链表 实现对循环链表的初始化,创建,插入,删除,输出操作
- c语言链表基本操作(带有创建链表 删除 打印 插入)
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 链表基本操作(创建,插入,查找,删除)-C语言
- 单链表的基本操作,正序/逆序建表(尾插法/头插法)、计算单链表长度、输出单链表内容、插入、删除,给出完整代码
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- 链表(1)基本操作:创建,插入,删除,销毁等(模板类实现)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 常见算法:C语言中链表的操作(创建,插入,删除,输出)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 单链表基本操作的实现--创建、插入、查找、删除