c語言線性表的插入
Ⅰ 插入線性表c語言
修改了下 代碼如下:
#include<stdio.h>
const int maxsize=18;
struct sequenlist
{
int a[maxsize];
int len;
}seq;
/*
*
* 初始化線性表
*/
sequenlist init(sequenlist l)
{
l.len=100;
return l;
}
/*
*
* 初始化線性表2
*/
void input(sequenlist &l)
{
int n;
printf("請你輸入線性表元素的個數n:");
scanf("%d",&n);
l.len=n;
int i=0;
printf("請你輸入線性表n個元素:");
for(i=0;i<l.len;i++)
{
scanf("%d",&l.a[i]);
}
}
/*
*
* 遍歷線性表
*/
void out(sequenlist l)
{
int i=0;
for(i=0;i<l.len;i++)
{
printf("%d ",l.a[i]);
}
}
/**
*
* 插入元素
**/
void insert(sequenlist &l,int X,int index)
{
if(index<0 && index>=l.len)
printf("索引 index 無效,插入失敗!");
else
{
int j;
for(j=l.len-1;j>=index-1;j--)
{
l.a[j+1]=l.a[j];
}
l.a[index-1]=X;
l.len++;
}
}
/**
* 刪除元素
*
*/
void delet(sequenlist &l,int index)
{
int j;
for(j=index;j<=l.len-1;j++)
{
l.a[j-1]=l.a[j];
}
l.len--;
}
void main()
{
input(seq);
out(seq); //遍歷
printf("\n");
insert(seq,5,10);
out(seq); //遍歷
printf("\n");
delet(seq,5);
out(seq); //遍歷
printf("\n");
}
Ⅱ c語言線性表的實現中的頭插法和尾插法
頭插法建表:演算法:
p=(ListNode*)malloc(sizeof(ListNode));//生成新結點
p->data=ch;//將讀入的數據放入新結點的數據域中
p->next=head;
head=p;
尾插法建表:演算法
p=(ListNode*)malloc(sizeof(ListNode));//生成新結點
p->data=ch;//將讀入的數據放入新結點的數據域中
if(head==NULL)
head=p;//新結點插入空表
else
rear->next=p;//將新結點插到*r之後
rear=p;//尾指針指向新表尾
時間復雜度都是O(n)
Ⅲ c語言簡單程序,有一段線性表插入的函數,請高手詳細解析,十分感謝
這是數據結構中標準的線性表插入程序,但是它不是真正的c語言,而是類c哦。
status Insertlist(Sqlist &L,int i,Elemtype e){
Elemtype *p; //在這里定義了一個*p的指針,目的是找到鏈表中每個結點的首地址就可以了,不用找一個結點的所用地址啊
int j;
if(L.length==L.listsize) //L.listsize是代表的表的上限值,是事先設定好的
printf("內存分配空間已不夠,請重新分配:\n");
p=L.elem;//這條語句應該寫在下一條語句的後面,也就是分配後的地址給到臨時指針變數p中
L.elem=(Elemtype *)realloc(p,(LISTSIZE+L.listsize)*sizeof(Elemtype));
//這條語句是想一下子分配足夠大的線性表空間,realloc在C中不認可的,實現時還要用malloc,這里只是設計實現的,而分配成功後L.elem只是得到分配單元的首地址,不成功則是空值。
if(!p){
printf("分配空間失敗");
exit(0);
}
L.elem=p;//這條語句應該沒用吧
L.length++;//這條語句應該放在成功插入的後面,也就是return 1;語句之前才對
L.listsize=L.listsize+LISTSIZE_INCE;
if(i<1||i>L.length){ //這里用到的是運算符||,代表是「或」,也就是說i<1代表輸入時誤操作造成,而i>L.length代表輸入的位置超出表中數據的個數,位置找不到。
printf("插入位置輸入不正確,請重新操作:\n");
return 0;//代表插入失敗
}
else{
for(j=L.length-1;j>=i;j--)//從i到最後表尾順次下移,騰出i的位置
L.elem[j+1]=L.elem[j];
L.elem[i]=e;//將數據插入到i的位置中
return 1;//代表插入成功
}
return 1;
}
Ⅳ 利用c語言實現順序存儲線性表的插入!
有時會出現這種情況。他會以為是木馬。
int GetElem();
int InstInsert();
typedef int ElemType;
typedef struct{
ElemType *elem; //存儲空間基地址
int length; //當前長度
int listsize;//當前分配的存儲容量
}SqList;
int InitList(SqList *L){
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(-1);//存儲空間分配失敗
L->length=0; //空表長度為0
L->listsize=LIST_INIT_SIZE; //初始存儲容量
printf("線性鏈表創建成功\n");
return OK;
}
int Input(SqList *L){
ElemType temp,*newbase;
printf("輸入順序列表的數據,以0為結束標志\n");
scanf("%d",&temp);
while(temp!=0){
if(L->length>=L->listsize){
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!newbase) exit(-1);//存儲空間分配失敗
L->elem=newbase; //空間新基地址
L->listsize+=LISTINCREMENT; //增加存儲容量
}
L->elem[L->length++]=temp;
scanf("%d",&temp);
}
printf("輸入數據結束!!\n");
return OK;
}
int Onput(SqList *L){
int i=0;
printf("輸出線性表數據:");
while(i<L->length){
printf("%d\t",L->elem[i]);
i++;
}
printf("\n");
}
int ClearList(SqList *L){
L->length=0;
printf("清除成功!\n");
return OK;
}
void ListEmpty(SqList L){
if(L.elem!=NULL)
printf("true!\n");
else
printf("false!\n");
}
void ListLength(SqList L){
printf("線性表的長度是:%d\n",L.length);
return ;
}
int GetElem(SqList L,int i,SqList *e){
e=L.elem[i-1];
return e;
}
void PriorElem(SqList L,int cur_e,SqList *pre_e){
if(cur_e!=L.elem[0]){
pre_e=L.elem[0];
printf("前驅值為:%d\n",pre_e);
}
else
printf("pre_e無意義\n");
}
void NextElem(SqList L,int cur_e,SqList *next_e){
if(cur_e!=L.elem[L.length-1]){
next_e=L.elem[L.length-1];
printf("後繼值為:%d\n",next_e);
}
else
printf("next_e無意義\n");
}
int ListInsert(SqList *L,int i,int e){
ElemType *newbase,*p,*q;
if(1>i||i>(L->length+1))
return -1;
if(L->length>=L->listsize){ //新增內存
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //開辟新內存空間
if(!newbase)
exit(-1); //存儲分配失敗
L->elem=newbase; //新基地址
L->listsize+=LISTINCREMENT; //新增內存容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
++L->length;
return OK;
}
int ListDelete(SqList *L,int i,int e){
ElemType *p,*q;
if(i<1||i>L->length)
return -1;
q=&(L->elem[i-1]);
e=L->elem[i-1];
p=L->elem+L->length-1;
for(;p>=q;q++)
*q=*(q+1);
--L->length;
printf("刪除的值為:%d\n",e);
return OK;
}
Ⅳ 用c語言建立一個順序存儲的線性表,實現線性表的插入、刪除操作
鏈表
1。是由結構體和指針構成的。
2。包括兩個部分一個是數據域和指針域。
3。鏈表中的結點分為兩類:頭結點和一般結點。頭結點是沒有數據域的。
4。基本操作有:初始化鏈表,增加結點和刪除結點,求鏈表的長度等等。
struct Linknode{
int data;
struct Linknode *next;
};
這個地方有個知識點:這個是鏈表的數據結構是有結構體和指針構成。結構體名為Linknode.但這裡面沒有定義結構體變數,只有我們定義了結構體變數才能使用結構體。
結構體變數怎麼定義呢?
有兩種方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我們都希望採用第2種,這樣的好處是: 當我們再定義結構體變數時,可以用:Linklist p;而如果我們採用第一種還必須採用 struct Linknode p;對比一下就可以知道第2種要簡單很多。那麼下面我們都採用第2種方式來定義結構體變數。
上面我們已經定義了一個鏈表:
1。初始化鏈表。
#include<stdio.h>
#include<stdlib.h>
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等於L,對與*Lnode的分配空間相當與對主函數中的L分配空間。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化鏈表的時候,我們用到了2級指針為什麼呢?因為我們希望在InitLinkList函數生成的頭結點,主函數中也能指向這個頭結點。如果我們用一級指針的話,用malloc分配空間的時候,它將會返回分配空間的首地址給指針變數Lnode,而不能使是的空間被主函數中指針變數L得到這個地址。所以我們要用2級指針。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加鏈表結點
增加鏈表結點其實很簡單,一般用到三個結構體指針變數和一個循環結構。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
break;
p=Lnode->next;//p指向頭結點
//通過while循環和指針變數p定位要插入的結點q的位置。
while(p)
p=p->next;
//生成一個要插入的結點
q=(Linklist)malloc(sizeof(Linklist));//申請要插入的結點空間
q->data=d;//填充要插入結點的數據域
q->next=p->next;//首先填充要插入結點q的指針域進行填充。
p->next=q;//然後把定位好的p指針域進行修改指向q.
}while(9);//循環退出的條件是輸入的數據-9999
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入結點
}
3。求鏈表的長度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向鏈表的第一個結點。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入一個結點
LengthLinkList(L)//求鏈表的長度。
}
4.刪除結點
刪除鏈表結點其實很簡單,一般用到三個結構體指針變數和一個循環結構。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向鏈表的頭結點
while(p)
{
q=p->next;//q指向當前結點的下一個結點。
free(p);//釋放當前結點
p=q;//p指向下一個結點
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入結點
LengthLinkList(L)//求鏈表的長度。
DestroyLinkList(L);//刪除鏈表結點
}
Ⅵ C語言線性表插入數據
你這個程序問題太多了,我不建議在這個程序的基礎上修改,有問題的程序總是會把人的思維搞亂,建議你對著書打一遍,然後把標准常式和你這個進行比較,你會發現你的問題在哪裡。
我來幫你總結一下:
1、主函數中你對print函數的調用形式不對。你的print函數沒有返回值,不能用空返回值為p和head賦值,這沒有意義也不符合邏輯;而且,print函數調用的時候括弧里沒有帶參數!這是很嚴重的錯誤
2、inlist函數本來就沒有返回值,卻被定義成int型的,它的參數head也沒有被使用,這在線性鏈表中簡直了。。。
3、你用了兩個全局變數,用a 來記錄鏈表長度本無可厚非,但是你竟然用全局指針變數,這非常容易導致邏輯錯誤的,應當盡量避免。
4、你的插入函數inlist演算法存在問題(自己寫的難免會有問題):你沒有為插入的節點分配空間,而是准備直接覆蓋原來那個位置的節點的值,這是不對的。如果考慮到分配空間,並且不用全局指針的話,演算法還要考慮插入的位置是在頭插入,尾插入還是中間插入,這三種情況是不同的。因此,插入函數絕對沒有你想的這么簡單。
5、我沒有看懂你main函數里p是用來干什麼的。
綜合以上內容,我認為你邏輯混亂。我的建議是照著書上打一遍,然後一句一句的在紙上模擬執行,畫出鏈表,觀察執行過程的變化,並且理解它,然後記住他的演算法,再不看書自己打一遍。此外,建議你仔細看書上有關函數調用的內容。