c语言建立单链表及基于单链表的操作
2014-03-10 11:48
337 查看
要实现的功能包括:
1:链表的初始化
2:头部插入结点(尾插入的话,加个尾指针)
3:非降序插入
4:从链表中删除指定的元素
5:从链表中删除第i个位置的元素
6:输出链表
7:获取第i个位置的值
8:在第i个位置插入结点
一个简单结点的结构体表示为:
struct note{
int data; /*数据成员可以是多个不同类型的数据*/
struct note *next; /*指针变量成员只能是-个*/
};
主要的函数如下:
完整代码如下:(main函数只调用了一部分函数,有需求可以自己修改)
1:链表的初始化
2:头部插入结点(尾插入的话,加个尾指针)
3:非降序插入
4:从链表中删除指定的元素
5:从链表中删除第i个位置的元素
6:输出链表
7:获取第i个位置的值
8:在第i个位置插入结点
一个简单结点的结构体表示为:
struct note{
int data; /*数据成员可以是多个不同类型的数据*/
struct note *next; /*指针变量成员只能是-个*/
};
主要的函数如下:
//初始化链表,建立一个头结点 linklist InitList(void); //头插入的方式,将元素ch的结点插入到表头 void CreateList_head(linklist head,ELEMENT ch); //以升序的方式插入新的结点 Status InsertNode_rise(linklist head,ELEMENT ch); //删除关键字是ch的结点 Status ListDelete_elem(linklist L,ELEMENT ch); //删除第i个位置的结点 Status ListDelete_i(linklist L,int i,ELEMENT *ch); //输出链表 void Print(linklist head); //获得第i个元素的值,以ch返回 Status Getelem(linklist L,int i,ELEMENT *ch); //在第i个位置插入结点 Status Listinsert(linklist head,int i,ELEMENT ch);
完整代码如下:(main函数只调用了一部分函数,有需求可以自己修改)
#include <stdio.h>
#include <stdlib.h>
#define ELEMENT int
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef struct node{
ELEMENT data;
struct node *next;
}listnode,*linklist;
//初始化链表,建立一个头结点 linklist InitList(void); //头插入的方式,将元素ch的结点插入到表头 void CreateList_head(linklist head,ELEMENT ch); //以升序的方式插入新的结点 Status InsertNode_rise(linklist head,ELEMENT ch); //删除关键字是ch的结点 Status ListDelete_elem(linklist L,ELEMENT ch); //删除第i个位置的结点 Status ListDelete_i(linklist L,int i,ELEMENT *ch); //输出链表 void Print(linklist head); //获得第i个元素的值,以ch返回 Status Getelem(linklist L,int i,ELEMENT *ch); //在第i个位置插入结点 Status Listinsert(linklist head,int i,ELEMENT ch);
int main(void)
{
linklist head,p;
int n,i,data,num,data1 = 15;
head = InitList();
printf("please input the number of data:");
while(scanf("%d",&n)){
printf("please input the data:");
for(i = 0;i < n;i++){
scanf("%d",&data);
CreateList_head(head,data);
}
Print(head);
printf("please input the num you want to delete:");
scanf("%d",&num);
if(!ListDelete_i(head,num,&data1))
printf("the num is too big!\n");
Print(head);
printf("please input the number of data:");
}
return 0;
}
linklist InitList(void)
{
linklist L;
L = (linklist)malloc(sizeof(listnode));
if(!L){
printf("Memory allocation failure!\n");
exit(OVERFLOW);
}
L->next = NULL;
return L;
}
void CreateList_head(linklist head,ELEMENT ch)
{
linklist p;
p = (linklist)malloc(sizeof(listnode));
if(!p){
printf("Memory allocation failure!\n");
exit(OVERFLOW);
}
p->data = ch;
p->next = head->next;
head->next = p;
//return head;
}
Status Getelem(linklist L,int i,ELEMENT *ch)
{
int j;
linklist p;
p = L->next; //这两句是以要找的元素位置为目标,p指向第几个元素,j就为第几个元素
j = 1;
while(p && j<i){
p = p->next;
j++;
}
if(!p || j>i) //第i个元素大于表长或小于零
return ERROR;
*ch = p->data;
return OK;
}
Status Listinsert(linklist head,int i,ELEMENT ch)
{
int j;
linklist p,s;
p = head; //这两句是以找i-1为目标,p为目标的前一个位置的指针,j相应的也为前一个位置的值
j = 0;
while(p && j<i-1){
p = p->next;
j++;
}
if(!p || j > i-1)
return ERROR;
s = (linklist)malloc(sizeof(listnode));
if(!s){
printf("Memory allocation failure!\n");
exit(OVERFLOW);
}
s->data = ch;
s->next = p->next;
p->next = s;
return OK;
}
Status InsertNode_rise(linklist head,ELEMENT ch)
{
linklist p,q,r;
p = (linklist)malloc(sizeof(listnode));
if(!p){
printf("Memory allocation failure!\n");
exit(OVERFLOW);
}
p->data = ch;
if(head->next == NULL){
head->next = p;
p->next = NULL;
}
else{
q = head;
r = q->next;
while(r && r->data < ch){
q = r;
r = r->next;
}
if(!r){
q->next = p;
p->next = NULL;
}
else{
p->next = r;
q->next = p;
}
}
return OK;
}
Status ListDelete_elem(linklist L,ELEMENT ch)
{
linklist p;
while(L->next && L->next->data != ch){
L = L->next;
}
if(L->next == NULL){
return ERROR;
}
p = L->next;
L->next = L->next->next;
free(p);
return OK;
}
Status ListDelete_i(linklist L,int i,ELEMENT *ch)
{
int j;
linklist p,q;
p = L;
j = 1;
while(p->next && j<i){ //寻找第i个结点,并令p指向其前驱
p = p->next; //注意这里,寻找第几个是看j以及j和i之间的判断表达式
j++; //令p指向前驱,容易给指针赋值
}
if(!(p->next) || j > i)
return ERROR;
q = p->next;p->next = q->next;
*ch = q->data;
free(q);
return OK;
}
void Print(linklist head)
{
linklist p = head->next;
while(p){
printf("%d,",p->data);
p = p->next;
}
printf("\n");
}
相关文章推荐
- (2)单链表的操作 ① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- C语言《学生综合管理系统》基于链表和文件操作
- C语言链表操作(新增单向链表的逆序建立)
- 基于C语言的线性表操作,包含单链表和顺序线性表两种类型
- C语言数据结构 双向链表的建立与基本操作
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 链表基本操作(C语言)
- C语言之单链表操作之查找
- 单链表操作演示----C语言实现
- 链表常见操作-嵌入式C语言
- 链表操作集合 - C语言
- 数据结构实验之链表六:有序链表的建立(C语言)
- 单链表相关操作--C语言实现
- 单链表(一)——链表的建立
- c语言实现对传统单链表的创建、添加 遍历 删除 反转元素操作
- C语言实现单链表——之基本操作1
- 单链表的建立,把a~z 26个字母插入到链表中,并且倒叙,还要打印
- 数据结构---C语言单链表基本操作
- C语言(5)--链表操作