您的位置:首页 > 编程语言 > C语言/C++

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; /*指针变量成员只能是-个*/

};

主要的函数如下:

//初始化链表,建立一个头结点
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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: